如何让@PersistenceContext在CDI中加载我的EntityManager?

时间:2014-07-01 20:02:12

标签: java jpa java-ee-6 cdi

我目前正在考虑在不使用Spring的情况下构建新应用程序,而是尝试使用CDI进行所有注射。

我的DAO如下所示:


@TransactionManagement(TransactionManagementType.CONTAINER)
public class TestDao
{
    @PersistenceUnit(unitName="DefaultPersistenceUnit")
    private EntityManagerFactory emf;

    @PersistenceContext(unitName="DefaultPersistenceUnit")
    private EntityManager em;

    @TransactionAttribute(TransactionAttributeType.MANDATORY)
    public void test ( )
    {
        System.err.println ("EMF == " + emf);
        System.err.println ("EM == " + em);
    }
}

当我运行测试方法时,我看到以下内容:

EMF == org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory@1e3b8c4
EM == null

所以很明显我的EntityManager没有被CDI加载。它似乎应该,但没有快乐。

我已尝试在TomEE和WebSphere Liberty配置文件上进行托管,但两种情况下的效果相同。

有人能指出我正确的方向吗?我很难过......

...谢谢

2 个答案:

答案 0 :(得分:0)

EJB使用@PersistenceContext@TransactionManagement。要使其工作,您的组件必须是EJB。将@Stateless添加到您的课程中以使其正常工作。你需要在战争中使用ejb项目或嵌套bean。

答案 1 :(得分:0)

说实话,我不确定你为什么试图注入它们,它应该抛出错误,因为根据我的经验,@PersistenceContextEntityManager注入持久性或者@PersistenceUnit EntityManagerFactory,而不是两者。此外,您可以使用EntityManager方法从EntityManagerFactory获取createEntityManager(),因此我不明白这个问题。