首页 > 解决方案 > EntityManager 在 DAO 中为空,使用 @PersistenceContext 和 transaction-type="JTA"

问题描述

我面临在 DAO 类中注入实体管理器的问题,我搜索了很多解决方案,但无法解决这个问题。

我有 EJB Bean 类

@Stateless(name = "MyBean", mappedName = "MyBean")
@Remote(MYRemoteBeanI.class)
public class MyBeanImpl implements MYRemoteBeanI {

@EJB
MyDAO dao; // This DAO gets injected. But entity manager inside this DAO is null

}

DAO 类

@Stateless
public class MyDAO {

//This is not injecting, it will be always null
@PersistenceContext(unitName="MyPersistenceUnit")
private EntityManager entityManager; 

}

Persistence.xml 如下

<persistence-unit name="MyPersistenceUnit" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>myDataSource</jta-data-source>
<mapping-file>META-INF/orm.xml</mapping-file>
<!-- Some managed classes -->
<!-- Some properties -->
</persistence-unit>
</persistence>

请帮助我解决这个问题。我是 EJB 世界的新手!

标签: jpaejbeclipselinkejb-3.0ejb-3.1

解决方案


似乎没有从 Persistence.xml 读取您的持久性单元。xml在哪里?

这是连接到 Oracle DB 的 Jboss 7/Wildfly 中的一个工作示例。

@Stateless
public class MyServiceImpl implements MyService {
    @EJB(name = "myDAO")
    private MyDAO segmentDTO;
}

@Local
public interface MyDAO {

}

@Stateless
public class MyDAOImpl implements MyDAO {
    @PersistenceContext(unitName = "exampleEM")
    protected EntityManager entityManager;
}

资源/META-INF/persistence.xml

<persistence>
    <persistence-unit name="exampleEM" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
        <!-- your entities -->

        <properties>
            <property name="hibernate.connection.autocommit" value="false" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.format_sql" value="false" />
            <property name="hibernate.use_sql_comments" value="false" />
            <property name="hibernate.id.new_generator_mappings" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
        </properties>
    </persistence-unit>
</persistence>

推荐阅读