2016-04-12 1 views
1

J'essaie de faire AuditLog avec cet exemple link sans ressort. J'ai utilisé JPA. J'ai essayé de annoter EntityManager mais il n'a pas work.I essayé de débogage et em dans MyUtil était nulle. Pouvez-vous m'aider à obtenir cette session? J'ai vu beaucoup de gens à l'aide de la session de mise en veille prolongée, mais si je veux utiliser EntityManager que dois-je faire? Mon exemple de code:JPA-Hibernate 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); 
} 
} 

Répondre

1

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

}