2013-07-27 18 views
6

0 iyi cevapla birkaç benzer soru gördüm.JPA hevesli yükleme FetchType.LAZY çocuk koleksiyonları

Bu çok basit olmalıdır. Java JPA kullanıyorum ve bazen değil ama her zaman bir çocuk varlıkları listesi yüklemek istiyorum. Ne yazık ki, ben tembelce almak için söylediğimde JPA beni dinlemiyor. ChildEntities özniteliğine hiçbir şekilde erişilemeyen kodumun hiçbir yerinde bulunmadığından% 100 emin oldum. Ancak, tüm çocuk varlıkları hala JPA.em(). (..) çağrısı üzerine hemen yüklenmeye devam ediyor. Bu, ek açıklamalarla ilişkiyi nasıl beyan ederim.

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

Ayrıca, bazen hevesli Bu koleksiyonu alıp dinamik zaman bunu yapmaya JPA söylemek mümkün umuyordum:

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

Ve bu ana varlık yüklemek nasıl. Yine de adım 2. Adım 1 sadece bu çalışma hakkını elde etmek içindir.

+1

nasıl getirilirken doğruluyoruz? Bir orm.xml veya başka bir yer eşleştirmesi var mı yoksa varlık ayarını geçersiz kılan ya da koleksiyonu tetikleyen varlık dinleyicileri ayarlanmış mı? Hangi sağlayıcıyı kullanıyorsunuz? – Chris

+0

Hata ayıklayıcısında, bulduktan sonra listenin doldurulduğunu görebiliyorum. Yapılandırma için herhangi bir XML kullanmıyorum, sadece ek açıklamalar. –

+0

Şimdilik son derece şişkin ve hacky bir çözüm yarattım. Bir çocuk listesi koleksiyonuna sahip ve diğeri olmayan iki ana varlık oluşturdum. Ne yazık ki, bu hack (birçok hack yapmak gibi) kodlarımın geri kalanına sıçradı. –

cevap

4

Bu şekilde yaptım. Bu bakınız, bu overthere çok mükemmel çalışıyor olacak:

@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; 


    } 

kullanın @OneToOne(fetch = FetchType.LAZY....) bir eşleştirme biri için ve toplama kullanımı @LazyCollection(LazyCollectionOption.TRUE) için.

@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 

} 

Eğer koleksiyon erişmeden önce birleştirme ve nesneyi almak istediğinizde: Ben aktif 2. cevabını arıyorum

@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

Bu hafta boş zamanlarım olduğunda bunu deneyeceğim. Teşekkürler. –

+0

size bekliyoruz! – Rajesh

+0

neden birleştirme özelliğini getMemberWithMemberDetails uygulamasında kullandığını anlatabilir misiniz? – iku

2

: bazen tembel yük şeyler JPA alma ve hevesle başka zamanlar.

# 1 sorunuza gelince, bana istediğiniz gibi getreference() işlevini find() kullanmaktır. Hazırda bekletme özelliğini kullanıyorsanız, nesnenin bir başvurusunu oluşturacak ve yalnızca gerektiğinde gerçekten alacaktır.

Yardımcı olur eminim: When to use EntityManager.find() vs EntityManager.getReference()