2016-04-12 23 views
1

Ich versuche, AuditLog mit diesem Beispiel link ohne Feder zu tun. Ich habe JPA verwendet. Ich habe versucht, EntityManager kommentieren, aber es hat nicht funktioniert. Ich habe versucht zu debuggen und em in MyUtil war null. Kannst du mir helfen, diese Sitzung zu bekommen? Ich sah viele Leute, die Hibernate-Sitzung verwenden, aber wenn ich EntityManager verwenden möchte, was soll ich tun? Mein Beispielcode:JPA-Hibernate mit Hibernate Interceptor

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); 
} 
} 

Antwort

1

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; 
    } 

} 
Verwandte Themen