事务拦截器CDI JPA JavaSE

时间:2015-06-14 03:56:28

标签: jpa cdi interceptor transactional

我使用CDI为我的DAO做了一个拦截器事务。但是,注入DAO的EntityManager与事务拦截器中使用的不同。如何使用相同的EntityManager?

DAO课程

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 Producer:

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上的print被调用了两次。

1 个答案:

答案 0 :(得分:0)

由于您的生产者方法具有EntityManager范围,因此它将为每个注入点生成一个新的.htaccess实例。

顺便说一下,您可能想要查看DeltaSpike(JPA和数据模块),而不是滚动自己的事务拦截器。