2016-04-12 80 views
1

我試着用沒有Spring的例子link做AuditLog。我使用JPA。我試圖註釋EntityManager,但它沒有工作。我試圖調試和emMyUtil爲空。你能幫助我得到那個會議嗎?我看到很多人使用hibernate會話,但如果我想使用EntityManager我應該怎麼做? 我的示例代碼:帶休眠攔截器的JPA-Hibernate

public class serviceBean { 

@PersistenceContext(unitName = "myPC") 
EntityManager em; //not null 

public insert(entity en) { 
    em.merge(en) 
} 

public class demoLog extends EmptyInterceptor { 

public void doSave(){ 
    MyUtil.logIt(entityLog); 
} 
} 

public class MyUtil { 

@PersistenceContext(unitName = "myPC") 
EntityManager em; // got null here 

public static void logIt(EntityLog entity) { 
    em.merge(entity); 
} 
} 

回答

1

如果你沒有容器管理的實體管理器(你提到的「無春」),則是相當簡單的。

請注意,我認爲你必須使用不同的持久性單元作爲審計日誌攔截器來防止無限循環(在我的例子中爲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; 
    } 

}