1

私には2つのエンティティがあります:

    @Entity
    public class Entity1{}

    @Entity
    public class Entity2{
        @OneToOne
        protected Entity1 e1;
    }

Entity1を検索する方法が1つあります

    Entity1 findEntity1(some args){
        EntityManager em = this.emfp.getEntityManager();
        //perform search
        return e1;
    }

このメソッドを使用してEntity2を検索します

    Entity2 findEntity2(some args){
        EntityManager em = this.emfp.getEntityManager();
        e1 = findEntity1(args);
        //perform search using e1 :  Entity2.e1 = e1
        return e2;
    }

各メソッドには独自のEntityManagerがあるため、独自の永続コンテキストがあります。最初のメソッドから返されたe1を2番目のメソッドで使用できますか?

4

2 に答える 2

1

説明している方法では実行できませんが、永続化コンテキストが異なるため、コードを微調整して、エンティティを同じコンテキストに効果的に配置できます。それらすべてを使用できるかどうかは、スタックによって異なります。

Java EE アプリケーションの場合、セッション Bean から検索を開始し、コンテナー管理を使用します。EntityManagerこれにより、永続コンテキストがトランザクションにラップされ、トランザクションの間、両方のエンティティが同じコンテキストに保持されます。

Java SE アプリケーションの場合、トランザクション - UserTransactions を引き続き使用できます。ただし、トランザクションのスパンを手動で制御する必要があります。

EXTENDED 永続コンテキストを使用します (JPA 2.0 以降)。明示的に無効化されるだけなので、フェッチされたすべてのエンティティは、そう言うまでコンテキスト内に残ります。

EntityManagerこれらすべてのソリューションでは、取得を変更する必要があります。@PersistenceContextJava EE コンテキストでアノテーションを 使用し、SE コンテキストで@PersistenceUnit取得しますEntityManagerFactory

編集: 同じトランザクション内にいる限り、検索を分割する EJB の数は問題ではありません。経験則として、トランザクションは最初の EJB メソッドが呼び出されたときに開始され、このメソッドが返されたときに終了します。このメソッドによって呼び出されるすべてのメソッドは、同じトランザクション内にあります。ただし、このデフォルトの動作は変更される可能性があります。EJB メソッドのトランザクション性は @TransactionAttributeアノテーションによって定義されるため、Bean に沿って呼び出しのパスをたどるだけです。

于 2012-11-12T15:50:05.070 に答える
0

いいえ、別の永続化コンテキストからエンティティを使用することはできません。

選択クエリを展開し、数値 ID や文字列などの基本的な型を使用する必要があります。

于 2012-11-12T15:39:04.620 に答える