如果你沒有容器管理的實體管理器(你提到的「無春」),則是相當簡單的。
請注意,我認爲你必須使用不同的持久性單元作爲審計日誌攔截器來防止無限循環(在我的例子中爲PU_2)。
因此,你需要在META-INF的persistence.xml(爲保持數據庫連接設置和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>
你應該在編程主程序創建您的EntityManagerFactory和EntityManager的是這樣的:
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();
}
}
而像這樣在審計日誌Hibernate的攔截器:
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();
}
}
實體類:
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;
}
}