【问题标题】:How can I use CDI to produce a Hibernate Session?如何使用 CDI 生成 Hibernate Session?
【发布时间】:2013-08-05 18:55:48
【问题描述】:

我有这个 Resources 类,它产生了我的 entityManager 以及一个休眠会话:

public class Resources {

    @Produces
    @PersistenceContext
    private EntityManager em;

    @Produces
    public Session produceSession() {
        return em.unwrap(Session.class);
    }
}

当我在我的 EJB 类中注入 EntityManager 时,它工作正常,但使用注入的休眠会话只能在第一次工作。在此之后,它总是关闭。我认为 CDI 有效,但它只注入我的依赖项一次,所以我不能使用它。

所以,我决定使用这个:

entityManager.unwrap(Session.class)

每次我需要一个休眠会话。例如:

return criteria.getExecutableCriteria(entityManager.unwrap(Session.class)).list();

我的两个问题是:还有其他方法吗?这是一个正确的方法吗?

希望有人在这里帮助我! 谢谢!

【问题讨论】:

    标签: hibernate session cdi entitymanager


    【解决方案1】:

    有一些 CDI 扩展,其中一些提供休眠集成。但实际上,这对你来说应该很好。

    不过,JPA 2 有一个您可能感兴趣的标准 API。

    【讨论】:

    • 嗨,约翰,感谢您的回答。我已经知道 JPA 2 Criteria,但它有点复杂,我的意思是,比 Hibernate Criteria 更复杂。我将继续使用这种方法,并将看看那些 CDI 扩展。无论如何,非常感谢!
    • 这看起来是因为您的项目中的默认事务边界(和默认 CDI 范围)。默认情况下(意味着没有任何额外的注释或配置)EntityManager 的持续时间是事务的持续时间,恰好是方法的持续时间。没有范围注释的 CDI bean 也是 DependentScoped,这意味着它们与包含它们的父对象一样长。这两者的结合可能是您遇到的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2015-10-22
    • 2011-11-07
    • 2011-02-01
    • 2012-08-23
    • 1970-01-01
    • 2017-11-27
    相关资源
    最近更新 更多