1

EntityManagerオブジェクトがemあり、次の擬似コードがあるとします。

@PersistenceContext(unitName = "myPU")
private EntityManager em;

public void runQuery()
{
    for(int i=0; i<100; i++)
    {   Query q = em.createNativeQuery(someQuery);
        List list = q.getResultList();
        //process result
        ...
        ...
    } 
}

entityManagerは基盤となるデータベース接続をどのように管理しますか?上記のコードに対して、接続セッションは1つだけですか、それとも100セッションですか?

私が尋ねている理由は、接続セッションごとに、クエリを実行する前に一時テーブルを作成する必要があるためです。私がやりたいことは次のようなものです:

    for(int i=0; i<100; i++)
    {   //first check if temp table does not exist
         createTemptTable;
       // then run the query
        Query q = em.createNativeQuery(someQuery);
        List list = q.getResultList();
        //process result
        ...
        ...
    } 

しかし、テーブルを作成してクエリを実行するのと同じセッションにあることをどのように確認できますか?

4

2 に答える 2

1

注入されたEntityManagerには、コンテナーによって管理される接続プールから取得されるDBへの接続が1つあります。したがって、上記のコードのすべてのクエリは、データベースへの同じ接続で実行されます。

于 2013-01-30T19:13:23.473 に答える
1

Java EEでは、SessionBeanでは、永続コンテキストはJavaEEコンテナーによって管理されます。注入されたEntityManagerは通常、実際のJPAEntityManagerを保持するプロキシになります。すべてのJTAトランザクション境界を越えて、プロキシはJPA EntityManagerを解放し、新しいものを取得します(または少なくともclear()します)。トランザクションの外部では、コンテナーは操作ごとに新しいEntityManagerを取得するか、単一のEntityManagerを保持する場合があります(これは仕様では明確に定義されていませんが、要求ごとに新しいEntityManagerであると想定しています)。

JTAで管理されているJPAEntityManagerは、JTAトランザクションの間、同じJDBC/データベース接続を使用します。メソッドがJTAトランザクション内にある限り、コードは同じ接続を持ちます。通常、SessionBeanメソッドはデフォルトでトランザクションであるため、別の方法で構成しない限り、各メソッドは独自のトランザクションに含める必要があります。

http://en.wikibooks.org/wiki/Java_Persistence/Runtime#Java_Enterprise_Editionを参照してください 。

于 2013-01-31T14:06:26.020 に答える