2017-09-29 10 views
0

私は正確な問題を反映していない多くの同様の質問を探しています。誰かがすでにこの問題を解決したことを見落とした場合は、私に知らせてください。EntityManagerは@PersistenceContextのステートレスセッションBeanに挿入されていません

私は現在、Wildfly 10.1上で古いEJB CMP BeanをJPAに移行しています。 ここでの問題は、ステートレスセッションBeanのentitymanagerに@PersistenceContextが挿入されておらず、EntityManagerのNULLが残っていることです。私はEntityManagerFactoryを使ってこれを回避しようとしました。

サーバー側からのpersistence.xml、EJB2セッション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> 
+0

EntityManagerFactoryを挿入できますか? –

+0

プロジェクトの構成は? persistence.xmlはどこに置いていますか? – empyros

答えて

0

EJB 2セッションBeanは、注入をサポートしていません。

@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のファイルで、それへの参照を削除します。(それは、既存のejb-jar.xmlでStateless宣言されていると仮定して)、「現代」EJBに変換することを検討してください。

CDAサポートがあるため、EntityManagerをどこにでも注入できるはずなので、CAAFEntityUtilを削除することを検討してください。

関連する問題