2011-01-26 9 views
0

ヘルパクラスにエンティティマネージャを挿入しようとしていますが、これをセッションBeanからヘルパーに渡すことはできますが、問題は静的initでエンティティマネージャを使用することですヘルパークラス(のようないくつかのこと)のブロック:EJBヘルパークラスのエンティティマネージャを検索する

class MySessionBeanHelperClass 
{ 
// staff here... 


    static 
{ 
    SomeClass s = new SomeClass(entityManager); 
} 
} 

だから、私は唯一の方法は、それを注入するのではなく、エンティティマネージャをルックアップすると思います。渡されたSessionContentを使用してもここでは動作しません。

2番目の質問は次のとおりです。 通常の方法でリソース(この場合はエンティティマネージャ)を検索した場合(次のようなものです:)

Context ic = new InitialContext(); 
em = (EntityManager) ic.lookup("java:comp/env/persistence/em"); 

これは、このエンティティマネージャが使用するすべてのトランザクションを、Bean管理のトランザクションに変換しますか?

ありがとうございます!

答えて

1

スタティックイニシャライザから行うのは良い考えではないと思います。参照が行われる前にすべての必要なサービス(JNDI、JPAなど)が起動していることを確認する必要がありますが、静的初期化子から行う場合は保証することはできません。

EJBの既知の問題は、アプリケーションでワンタイムタスクを実行する「標準的な」方法がないことです。開始/停止ができますが、次のリンクでトリックを使用することができます。

How to perform a DB cleanup operation upon shutdown in an EJB container

の例では、アプリ時にアクションを実行するためです。停止することができますが、代わりにServlet#initを上書きできます。

+1

'これはEJBの既知の問題です。アプリでワンタイムタスクを実行する「標準的な」方法はありません。これは実際には当てはまりません。 @Singletonと@Startupを組み合わせると、EJB 3.1でこれが正確に実行されます。 TSが彼がEJB 3.0を使用していることを示して以来、これは残念なことに彼の選択肢ではありません。 –

+0

@arjan:ああ、彼らは3.1でそれを修正しましたか?良い! –

+0

あなたは正しいです、それは悪いデザインのようでした! –

1

Noにお答えください。

最初の質問は、実際には良い考えではありません。ところで、何してるの?ヘルパークラスにEntityManagerが必要な場合は、プライベートインスタンスレベルの変数にし、ヘルパークラスコンストラクタを使用してセッションBeanから渡す方が良いでしょう。

+0

ありがとう:)私は、リクエストがクライアントから来るたびにcreate instanceの代わりにいくつかのクラス(非ejb)から静的インスタンスを作成したかっただけです。 –

+0

@Mohammed: 'EntityManager'はEJBではありませんが、あなたはそれを正しく理解しています。しかし、それは依然として管理対象オブジェクトであり、コンテナがインスタンス化するかどうか、コンテナがそれをインスタンス化するかどうかはわかりません。私たちがそれを注入するとき、それは単に検索の代替手段を意味するだけです。ですから、私の提案はうまくいくはずです。 –

関連する問題