2009-06-24 15 views
1

EntityManagerを挿入するための@PersistenceContextがないことと、トランザクションを手動で管理する必要があることを考慮すると、そのようなアプリケーションを設計する最良の方法?非Java EE Webサーバー(例えばTomcat)でJPAを設計する方法

EntityManagerFactory/EntityManagerについては、私が見る限り、各DAOには、EntityManagerを受け入れる必要があります。あなたはのEntityManager#の近くに()を呼び出すないときに上昇

public class DAOImpl implements DAO 
{ 
    private EntityManager em; 

    DAOImpl(EntityManager em){ 
     this.em = em; 
    } 

    //all CRUD operations follow 
} 

最初の質問はありますか?

点A:私はそれを参照してください方法、あなたは現在のスレッドにEntityManagerを関連付けることを意味リクエストサイクルの終わりにFilterでこれをやったほうが良いです

(ThreadLocalのを使用していますか?)

2番目の質問は、EntityManagerをいつ、どのように注入するのですか?

我々が作成してEntityManagerFactoryを閉じる

public static EntityManager createEntityManager(){ 
return entityManagerFactory.createEntityManager(PERSISTENT_NAME); 
} 

を次のように、我々は静的メソッドを持つことができますが、我々はDAOを作成するカプセル化したいので、私たちは、例えば、工場を使用することができServletContextListenerがある考慮

点Aあたりとして、私たちは現在のスレッドのEntityManagerを使用してDAOを作成するためにThreadLocalを使用する必要があります
public class DAOFactory 
{ 
    public static DAO dao(){ 
    //return a new DAO 
    } 
} 

トランザクションを管理する。

私は(JPA仕様を模倣する)最も良い方法は、独自のトランザクションアノテーションを作成し、リフレクションを使用して開始/コミット/ロールバック操作を挿入することです。

あなたは、私はすべてのことをしないだろう取引

答えて

3

を扱うDAOFactoryからProxyを返す必要があります。 JPA仕様全体を自分自身で再作成しようとするのはなぜですか?コンテナなしでJPAを使用できるだけで済みます。

春はこれであなたを助けることができます。それを試してみてください。

+0

私は本当にポイントを見ることができませんが、これらは私に課せられた制限なので、これを実装する方法を見つけなければなりません。 – qnoid

関連する問題