0

1つの永続ユニットと多くのEJB(サービスおよびDAOレイヤーとして)を含むEJBモジュールを備えたEARアプリケーションがあります。

@Stateless
public class BranchDAO {
    @PersistenceContext
    private EntityManager entityManager;
}

ただし、ステートレスBeanとしてのDAOは推奨されません。したがって、CDIを使用してこの注釈を作成します。

@Dependent
@Stereotype
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DAO {
}

私のDAOが使用しないように変更された後@Stateless

@DAO
public class BranchDAO {
    @PersistenceContext
    private EntityManager entityManager;
}

ただし、Glassfishは、アプリケーションの起動時にエンティティマネージャを起動しません。そして、DAOに電話すると、エンティティマネージャーは違法な状態になっています。

java.lang.IllegalStateException:unitNamenullのEntityManagerFactoryを取得できません

このエラーはGlassfish3でのみ発生し、JBoss AS6では発生しません。JBossAS6を使用すると、起動時にHibernateログを確認できます(ただし、Glassfishでは表示されません)。

一時的な解決策として、以下の内容でステートレスBeanを作成しました。これは美しい解決策ではありませんが、Glassfishでは正常に機能します。

@Stateless
@Startup
public class AutoStartEntityManager {

    @PersistenceContext
    private EntityManager entityManager;

}

@Statelessでは、 DAOで使用していないときにGlassfishにEntityManagerを強制的に起動させるにはどうすればよいですか?

4

1 に答える 1

1

unitName を明示的に指定してみてください。

@PersistenceContext(unitName="yourJPAUnitName")
private EntityManager manager;

(補足-依存スコープでDAOが必要ですか?シングルトンであるべきではありませんか?)

于 2011-02-02T17:05:40.337 に答える