2013-07-27 5 views
6

私はよく似た質問をいくつか見てきました。JPAは、FetchType.LAZY子コレクションを読み込むことを熱望しています

これは非常に簡単です。私はJava JPAを使用しています。子エンティティのリストをロードする場合がありますが、すべてではありません。残念なことに、JPAは私が遅れてそれを取ってくると言うと、私の言うことを聞いていないようです。 childEntities属性が何らかの方法でアクセスされている場所にコードがどこにもないことを100%確信しています。しかし、JPA.em()。find(..)呼び出しの直後に、すべての子エンティティがロードされています。これがアノテーションとの関係を宣言する方法です。

@Entity 
@Table(name = "parentEntities") 
public class ParentEntity implements Serializable { 
    .... 
    @OneToMany(mappedBy = "entityPropertyName", fetch = FetchType.LAZY) 
    public List<ChildEntity> childEntities; 
    ... 
} 

そして、これは私が親エンティティをロードする方法である:

ParentEntity parentEntity = JPA.em().find(ParentEntity.class, id); 

また、私は時々熱心このコレクションをフェッチし、動的時にそうするようにJPAを伝えることができるように期待していました。しかしそれはステップ2です。ステップ1は、この作業の権利を取得することです。

+1

は、どのようにそれをフェッチすることを確認していますか? orm.xmlや他の場所のマッピングやエンティティ・リスナーが設定されて、遅延設定をオーバーライドするか、コレクションをトリガーすることができますか?あなたはどのプロバイダを使用していますか? – Chris

+0

デバッガでは、find呼び出しの直後にリストが作成されているのがわかります。私は構成にXMLを使用せず、アノテーションのみを使用しています。 –

+0

今のところ、私は非常に肥大した、ハッキーなソリューションを作りました。私は2つの親エンティティを作成しました.1つは子リストコレクションと1つありません。残念なことに、このハッキング(多くのハックがそうであるように)は、コードの残りの部分にカスケードします。 –

答えて

4

私はこのようにしました。 1つのマッピングおよびコレクション使用@LazyCollection(LazyCollectionOption.TRUE)のための1のために

@Entity 
@Table(name = "member_information") 
    public class MemberInformation implements Serilizable{ 

    @OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE},optional = false) 
     private MemberInformationDetails memberInformationDetailsId; 


    @LazyCollection(LazyCollectionOption.TRUE) 
     @OneToMany(mappedBy = "memberInformationId", cascade = CascadeType.ALL) 
     private Collection<AccountOpening> accountOpeningCollection; 


    } 

使用@OneToOne(fetch = FetchType.LAZY....):これを参照してください、それはあまりにも良好overthere働くことになります。

@Entity 
@Table(name = "member_info_details") 
public class MemberInformationDetails implements Serializable{ 

@OneToOne(mappedBy = "memberInformationDetailsId") 
    private MemberInformation memberInformationId; 

.......//getter and setters 

} 


@Entity 
@Table(name = "account_opening") 
public class AccountOpening implements Serializable { 

@JoinColumn(name = "member_information_id", referencedColumnName = "id", nullable = false) 
    @ManyToOne(optional = false) 
    private MemberInformation memberInformationId; 

..........//getters and setters 

} 

あなたは、コレクションにアクセスする前にマージし、オブジェクトを取得したい:

@Stateless 
public class MemberInformationFacade{ 
.............. 
    public MemberInformation getMemberWithMemberDetails(MemberInformation m) { 
     m = getEntityManager().merge(m); 
     try { 
      m.getMemberInformationDetailsId().getId(); 


      m.getMemberInformationDetailsId().accountOpeningCollection().size(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return m; 
    } 

} 
+0

今週私は自由な時間を取るときにこれを試してみましょう。ありがとう。 –

+0

あなたは大歓迎です! – Rajesh

+0

getMemberWithMemberDetailsでマージを使用する理由を教えてください。 – iku

2

私は積極的にあなたの#2に答えを探しています:怠惰な負荷のものにJPAを取得し、時にはと熱心に他の回。

あなたの#1質問については、find()の代わりにgetReference()を使用することが欲しいと私に聞きます。 Hibernateを使用している場合、オブジェクトの参照が作成され、必要なときに実際に取得されます。

私はこれが役立つと確信している: When to use EntityManager.find() vs EntityManager.getReference()

関連する問題