Wenn Sie keine Container verwaltete Einheit Manager haben (Sie „ohne Frühling“ genannt), dann ist es ziemlich einfach.
Beachten Sie, dass ich denke, dass Sie verschiedene Persistenzeinheit für den Überwachungsprotokoll Interceptor verwenden müssen, um Endlosschleife (PU_2 in meinem Beispiel) zu verhindern.
So müssen Sie persistence.xml in META-INF (zum Halten db Verbindungen Einstellungen und JPA/Hibernate Eigenschaften):
<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>
Und Sie sollten programmatisch Ihre EntityManagerFactory und EntityManager wie dies in Ihrem Hauptprogramm erstellen:
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();
}
}
wie folgt und in Ihrem Interceptor log Hibernate-Audit:
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();
}
}
Die Entitätsklassen:
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;
}
}