2011-02-02 9 views
0

EJBモジュールを持つEARアプリケーションがあります。永続ユニットと多くのEJB(サービスとDAOレイヤー)が含まれています。DAOがステートレスでない場合、GlassfishはEntityManagerを起動しません。

@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:

のunitNameのヌルのためのEntityManagerFactoryを取得できませんこのエラーは、Glassfishの3で発生しますが、6のJBoss ASを使用して6のJBoss ASに私は、Hibernateのログを見ることができません私はGlassfishでそれらを見ることはありません。

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

@Stateless 
@Startup 
public class AutoStartEntityManager { 

    @PersistenceContext 
    private EntityManager entityManager; 

} 

だから、どのように私は私のDAOで@Statelessを使用していない時にEntityManagerを起動するにはGlassfishのを強制することができますか?

+0

? – axtavt

+0

ここでパスカルの答えを参照してください:http://stackoverflow.com/questions/3223112/javaee6-dao-should-it-be-stateless-or-applicationscoped/3224607#3224607 –

答えて

1

は明示のunitNameを指定してみてください。

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

(追記 - あなたはそれがシングルトンすべきではない依存範囲でDAOを必要と確信している?)

ステートレスのDAOと間違って何
+0

私はこの方法(unitNameで)を試みました。成功することはありません(同じ問題が発生します)。 DAOをコール元から継承スコープに依存して使用しています。私は正しい?よろしく。 –

+0

はい、それはあなたが呼び出し元と同じ数のDAOインスタンスを持つことを意味します。そして、これは必要ではありません。 – Bozho