事务拦截器 CDI JPA JavaSE
Transaction Interceptor CDI JPA JavaSE
我使用 CDI 为我的 DAO 创建了一个拦截器事务。但是,注入到 DAO 中的 EntityManager 与事务拦截器中使用的不同。我怎样才能使用相同的 EntityManager?
DAO Class
public class GenericDAO<T, PK> {
public final EntityManager manager;
public GenericDAO(EntityManager manager) {
this.manager = manager;
}
@Transactional
public T getById(PK pk) {
Object o = manager.find(getTypeClass(), (Serializable) pk);
return (T) o;
}
}
EntityManager 生产者:
public class EntityManagerProducer implements Serializable {
private static final long serialVersionUID = 1L;
@Produces
public EntityManager createEntityManager() {
return Persistence.createEntityManagerFactory("bd").createEntityManager();
}
public void closeEntityManager(@Disposes EntityManager manager) {
if (manager.isOpen()) {
manager.close();
System.out.println("CLOSE ENTITY MANAGER !!!!");
}
}
}
我看到它被创建了两次,因为方法 closeEntityManager 上的打印被调用了两次。
由于您的生产者方法具有 @Dependent
范围,它将为每个注入点生成一个新的 EntityManager
实例。
顺便说一句,与其滚动您自己的事务拦截器,不如查看 DeltaSpike(JPA 和数据模块)。
我使用 CDI 为我的 DAO 创建了一个拦截器事务。但是,注入到 DAO 中的 EntityManager 与事务拦截器中使用的不同。我怎样才能使用相同的 EntityManager?
DAO Class
public class GenericDAO<T, PK> {
public final EntityManager manager;
public GenericDAO(EntityManager manager) {
this.manager = manager;
}
@Transactional
public T getById(PK pk) {
Object o = manager.find(getTypeClass(), (Serializable) pk);
return (T) o;
}
}
EntityManager 生产者:
public class EntityManagerProducer implements Serializable {
private static final long serialVersionUID = 1L;
@Produces
public EntityManager createEntityManager() {
return Persistence.createEntityManagerFactory("bd").createEntityManager();
}
public void closeEntityManager(@Disposes EntityManager manager) {
if (manager.isOpen()) {
manager.close();
System.out.println("CLOSE ENTITY MANAGER !!!!");
}
}
}
我看到它被创建了两次,因为方法 closeEntityManager 上的打印被调用了两次。
由于您的生产者方法具有 @Dependent
范围,它将为每个注入点生成一个新的 EntityManager
实例。
顺便说一句,与其滚动您自己的事务拦截器,不如查看 DeltaSpike(JPA 和数据模块)。