事务拦截器 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 和数据模块)。