0

これは多くの時間を要していたと私は思っていましたが、私はちょうどそれを正しくするようです。 一部のEJBコンポーネントでWebアプリケーション8.5.5.9にWARアプリケーションをデプロイし、JPA 2.0とHibernate 4.2.0を使用してデータベース作業を行っています。 これらのEJBは、データベースからデータを要求するためにJNDIを介して他のアプリケーションから呼び出されます。 私が質問を投稿しませんほとんど以来:) ...よく(クライアント側のスタブと、すべての作品を生成:Hibernate EntityManagerはステートレスEJBに注入されていません

クライアントは、JNDIを介してリモートインタフェースIDatabaseServiceを呼び出して、コンテナが実装

@Stateless 
@Remote({ IDatabaseService.class }) 
public class DBServiceBean implements IDatabaseService 
{ 
    @EJB 
    private ApplicationService applicationService; 

    @Override 
    public BOApplication getApplication(String applicationId) 
    { 
     BOApplication app = applicationService.getApplication(applicationId); 
     return app; 
    } 

    // getters and setters 
} 
としてDBServiceBeanを返します。

DBServiceBeanサービスが

@Stateless 
@LocalBean 
public class ApplicationServiceImpl implements ApplicationService 
{ 
    @EJB 
    private ApplicationDao applicationDao; 

    @Override 
    public BOApplication getApplication(String applicationId) 
    { 
     DBApplication dbApplication = applicationDao.getApplication(applicationId); 

     BOApplication application = new BOApplication(dbApplication); 
     return application; 
    } 

    // getters and setters 
} 

ApplicationServiceはEJB

として注入DAO性を有するEJBとして注入しています
@Stateless 
@LocalBean 
public class HBApplicationDao implements ApplicationDao 
{ 
    @PersistenceContext(unitName = "some.jpa.name") 
    private EntityManager em; 

    @Override 
    public DBApplication getApplication(String applicationId) 
    { 
     String sql = "...."; 
     Query query = em.createQuery(sql, DBApplication.class); 
     query.setParameter("applicationid", applicationId); 
     DBApplication application = (DBApplication) query.getSingleResult(); 

     return application; 
    } 

    public void setEm(EntityManager em) 
    { 
     this.em = em; 
    } 
} 

DAOにはエンティティマネージャとエンティティマネージャがあります。 すべて正常に動作し、すべてのコンポーネントが正常に注入されますが、エンティティマネージャの注入は行われず、実行時にエンティティマネージャがNULLになります

ログを確認すると、すべてのクラス、バインディング、ハイバネートマッピングなどは問題なく作成されます内部にログメッセージを置くと、エンティティマネージャのsetterが呼び出されることはありません。

ここは私のpersistence.xmlです。

<?xml version="1.0" encoding="UTF-8"?> 
<persistence 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" 
    version="2.0"> 
    <persistence-unit name="some.jpa.name" transaction-type="JTA"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>jdbc/ExtensionDB</jta-data-source> 
     <class>some.package.entity.DBApplication</class> 
     <class>some.package.entity.DBApplicant</class> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
      <property name="openjpa.TransactionMode" value="managed" /> 
      <property name="openjpa.ConnectionFactoryMode" value="managed" /> 
      <property name="openjpa.jdbc.DBDictionary" value="oracle" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

私は、エンティティマネージャがBeanの作成に注入されていないが、そのBeanの後に注入されたことを理解します。また、そのBeanを別のコンテナ管理オブジェクト(JSF Beanなど)に注入する必要があります。 この問題に関するトピックを読んでいますが、どの要件を満たしていないかわかりません。

ありがとうございました。

答えて

0

申し訳ありませんが、問題はエンティティマネージャがnullだったのではなく、em.createQuery()がNullpointerExceptionをスローしたことです。

soome同様の問題をグーグルでの後、私はプロパティを追加した後、私のpersistence.xmlのが必要なプロパティ

<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform" /> 

に欠けていたことが判明、すべてがOKに働きました。

これらの以下のプロパティも必要ではありません(または問題を引き起こす可能性もあります)。私は彼らが何をするのか勉強しなかったが、彼らをチェックするだろう。

<property name="openjpa.TransactionMode" value="managed" /> 
<property name="openjpa.ConnectionFactoryMode" value="managed" /> 
<property name="openjpa.jdbc.DBDictionary" value="oracle" /> 
関連する問題