Si vous avez pas de gestionnaire d'entité gérée conteneur (vous avez mentionné « sans ressort ») alors il est assez simple.
Notez que je pense que vous devez utiliser différentes unités de l'intercepteur pour la persistance du journal d'audit pour empêcher la boucle infinie (PU_2 dans mon exemple).
Vous avez donc besoin persistence.xml dans META-INF (pour la tenue de paramètres de connexion db et propriétés JPA/Hibernate):
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">
<persistence-unit name="PU_1" transaction-type="RESOURCE_LOCAL">
<description>Can be anything</description>
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>pack.entities.Test</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver" />
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect" />
<property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/db01;create=true" />
<property name="javax.persistence.jdbc.user" value="APP" />
<property name="javax.persistence.jdbc.password" value="anything" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.ejb.interceptor" value="pack.AuditInterceptor" />
</properties>
</persistence-unit>
<persistence-unit name="PU_2" transaction-type="RESOURCE_LOCAL">
<description>For DB audit log</description>
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>pack.entities.AuditLog</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver" />
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect" />
<property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/db01;create=true" />
<property name="javax.persistence.jdbc.user" value="APP" />
<property name="javax.persistence.jdbc.password" value="anything" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
Et vous devez créer programatically votre EntityManagerFactory et EntityManager comme celui-ci dans votre programme principal:
package pack;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import pack.entities.Test;
public class Start {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("PU_1");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Test t = new Test();
t.setName("something for name");
em.persist(t);
em.getTransaction().commit();
em.getTransaction().begin();
t = new Test();
t.setName("something for name 2");
em.persist(t);
em.getTransaction().commit();
em.close();
emf.close();
}
}
Et comme dans votre mise en veille prolongée journal d'audit Interceptor:
package pack;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.hibernate.EmptyInterceptor;
import org.hibernate.Transaction;
import org.hibernate.type.Type;
import pack.entities.AuditLog;
public class AuditInterceptor extends EmptyInterceptor {
private EntityManager em;
public AuditInterceptor() {
System.out.println("AuditInterceptor constructed");
EntityManagerFactory emf = Persistence.createEntityManagerFactory("PU_2");
em = emf.createEntityManager();
}
@Override
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
System.out.println("onSave called");
em.getTransaction().begin();
AuditLog a = new AuditLog();
a.setEntry("object with ID: " + id + " saved");
em.persist(a);
em.getTransaction().commit();
return false;
}
@Override
public void afterTransactionCompletion(Transaction tx) {
System.out.println("afterTransactionCompletion called");
em.getTransaction().begin();
AuditLog a = new AuditLog();
a.setEntry("transaction: " + tx + " completed");
em.persist(a);
em.getTransaction().commit();
}
}
Les classes d'entité:
package pack.entities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Test {
@Id
@GeneratedValue
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package pack.entities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class AuditLog {
@Id
@GeneratedValue
private Long id;
private String entry;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEntry() {
return entry;
}
public void setEntry(String entry) {
this.entry = entry;
}
}