繁体   English   中英

没有使用@PersistenceContext将EntityManager注入到无状态会话Bean中

[英]EntityManager not injected in Stateless Session Bean with @PersistenceContext

我一直在研究许多类似的问题,这些问题并未反映出我的确切问题。 如果我忽略某人已经解决了此问题,请告诉我。

我目前正在将旧的EJB CMP Bean迁移到Wildfly 10.1上的JPA。 这里的问题是我的无状态会话bean中的entitymanager没有注入@PersistenceContext,从而使EntityManager为NULL。 我尝试使用EntityManagerFactory解决此问题。

内含来自服务器端的persistence.xml和EJB2 Session Bean代码。

请帮忙。

public class CAAFAdminServiceBean implements SessionBean {
        @PersistenceContext(unitName = "PFJPAEMJTA")
            private EntityManager em1;
            // For some reason, em1 is not initialized by EJB container though this is Session bean, ideally it should be.
            // Hence calling getEntityManager() to create EntityManager from its Factory.
            private EntityManager em = null;

        public void ejbCreate() {
        em = getEntityManager();
        // Set same object in the Util class so that same can be referenced anywhere.
                CAAFEntityUtil.setEntityManager(em);
        }

        private EntityManager getEntityManager() {
                if (em1 == null) {
                    if (em == null) {
                        PerfLog perflog = new PerfLog(new PerfLogEJBCalledCategory(this.getClass(), "getEntityManager"));
                        String status = PerfLog.FAIL;
                        try {
                            EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("PFJPAEMJTA");
                            em1 = em = entityManagerFactory.createEntityManager();
                            status = PerfLog.SUCCESS;
                            return em;
                        } finally {
                            perflog.end(status);
                        }
                    }
                    return em;
                }
                System.out.println("************EntityManager object is injected by EJB container, great to see that!!!************");
                return em1;
            }

        }


<?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
        <persistence-unit name="PFJPAEMJTA" transaction-type="JTA">
            <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
            <jta-data-source>java:jboss/jdbc/PF_TX_DATASOURCE</jta-data-source>
            <class>com.entity.rdbms.RDBMSComponentBean</class>   
            <properties>
                <property name="showSql" value="true"/>
                <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
                <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
            </properties>
        </persistence-unit>
    </persistence>

EJB 2会话Bean不支持注入。 考虑将其转换为“现代” EJB(假设在现有ejb-jar.xml中将其声明为Stateless ):

@Stateless
public class CAAFAdminServiceBean {

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

    @PostConstruct
    public void formerEjbCreate() {
        CAAFEntityUtil.setEntityManager(em);
    }

    public void someBusinessMethod(MyEntity myEntity) {
        em.persist(myEntity);
        ...
    }

    ...
}

并在ejb-jar.xml文件中删除对其的任何引用。

考虑删除CAAFEntityUtil,因为您也应该具有CDI支持,因此您应该能够在任何地方注入EntityManager。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM