【问题标题】:Transaction Interceptor CDI JPA JavaSE事务拦截器 CDI JPA JavaSE
【发布时间】:2015-06-14 03:56:27
【问题描述】:

我使用 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 生产者:

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

【问题讨论】:

    标签: jpa cdi interceptor transactional


    【解决方案1】:

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

    顺便说一句,与其滚动您自己的事务拦截器,不如查看DeltaSpike(JPA 和数据模块)。

    【讨论】:

    • 非常感谢您的提示。我读了很多关于 DeltaSpike 的文章,我认为这对我的目的很有帮助。有了它,注入两个entityManager的问题就迎刃而解了吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2020-06-17
    • 2014-03-10
    • 2016-02-06
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    相关资源
    最近更新 更多