如何使用CDI生成Hibernate会话?

如何使用CDI生成Hibernate会话?,hibernate,session,cdi,entitymanager,Hibernate,Session,Cdi,Entitymanager,我有一个资源类,它生成我的entityManager和hibernate会话: public class Resources { @Produces @PersistenceContext private EntityManager em; @Produces public Session produceSession() { return em.unwrap(Session.class); } } 当我在EJB类中注入Ent

我有一个资源类,它生成我的entityManager和hibernate会话:

public class Resources {

    @Produces
    @PersistenceContext
    private EntityManager em;

    @Produces
    public Session produceSession() {
        return em.unwrap(Session.class);
    }
}
当我在EJB类中注入EntityManager时,它可以正常工作,但是使用注入的hibernate会话只是第一次工作。在这之后,它总是关闭的。我认为CDI有效,但它只注入了我的依赖项一次,所以我不能使用它

所以,我决定用这个:

entityManager.unwrap(Session.class)

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

return criteria.getExecutableCriteria(entityManager.unwrap(Session.class)).list();
我的两个问题是:有没有其他方法可以做到这一点?这是正确的方法吗

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

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


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

嗨,John,谢谢您的回答。我已经知道JPA2标准,但它有点复杂,我的意思是,比Hibernate标准更复杂。我将继续使用这种方法,并将研究这些CDI扩展。无论如何,非常感谢!这似乎是因为项目中的默认事务边界(和默认CDI范围)。默认情况下(意味着没有任何附加注释或配置),EntityManager的持续时间是事务的持续时间,正好是方法的持续时间。另外,不带范围注释的CDIBean是DependentScoped的,这意味着它们与包含它们的父对象一样长。这两者的结合可能是您遇到的问题。