2010-10-20 10 views
7

Bence oldukça yaygın olduğunu düşündüğüm bir soru var ama bir cevap bulamıyorum.hibernate @ManyToMany bidirectional istekli alma

2 nesnem var: Grup ve Kullanıcı. Ben veritabanından bir kullanıcı almaya çalışırken

class Group 
{ 
    @ManyToMany(fetch = FetchType.EAGER) 
    List<User> users; 
} 

class User 
{ 
    @ManyToMany(fetch = FetchType.EAGER) 
    List<Group> groups; 
} 

Şimdi, onun grupları ve tüm grupların hepsi çok tüm kullanıcılarına getirmek ve getiriyor: Derslerim şuna benzer. Son olarak, stackoverflow istisnası alıyorum.

Bu sorunu nasıl çözebilirim ve hala çift yönlü ilişkilendirme ve listelerindeki nesnelere ulaşma yeteneğim var mı? Eğer mappedBy özelliğini (yine kullanması gerektiğini) kullanılarak dernek tarafını sahip senin iki yönlü Q bağlantılı kenarlarından birini yaparsanız

cevap

8

Eğer aynı sorun oluyor mu?

@Entity public class Group { 
    ... 
    @ManyToMany(fetch = FetchType.EAGER, mappedBy="groups") 
    List<User> users; 
} 

@Entity public class User { 
    ... 
    @ManyToMany(fetch = FetchType.EAGER) 
    List<Group> groups; 
} 

Güncelleme: Ben iki yönlü ilişki her iki tarafında getirilirken EAGER kullanılarak yasak olduğunu herhangi bir kanıt bulamıyorum ve AFAIK, hazırda belgelerinde böyle bir kısıtlamanın söz edilmez ve bu gibi/veya JPA şartnamesi. bir (şekilde benzer) konu Emmanuel Bernard this comment göre Aslında

:

LAZY veya EAGER kod temeli sonsuz bir döngü sayısında göre ortogonal olmalıdır. Hazırda halkalı grafikleri Benim için

, yukarıda (I yorumunda belirtildiği gibi) hazırda harita oluşturmaya işlemek mümkün olmalıdır ve bir gibi herhangi bir çelişkili davranışları dikkate almak cazip olacağını, oldukça açıktır ele bilir böcek.

numaralı sorunu yeniden oluşturmaya izin veren bir deneme dosyası sağlayabiliyorsanız, öneriyi bir sorun açmak olacaktır.

+0

evet. aynı şey olur. Ben her liste için tüm liste nesneleri getirmek için hazırda beklemede ihtiyaç duyduğunu ve sonsuz bir döngü olduğunu anlamış olabilir. Benim sorum ise, hazırda bekletme derinliğini sınırlamak mümkün ise (fetch_max_depth gibi ama çoktan çoğa). – refaelos

+0

@Rafa Aslında, Hazırda bekletme döngüsünü algılamasını ve uygun şeyi yapmasını beklerdim (ancak bunu test etmek için zaman almadım). Öte yandan, çoktan çoğunun iki tarafının hevesli bir şekilde yüklenmesi, iyi bir fikir gibi görünüyor. –

0

Hazırda bekletme işlevi, ihtiyaç duyduğu her şeyi hevesle almaya çalıştığında işe yarıyor. Nesneleri modellemek, hazırda bekletme yapmak zorundadır, bu nedenle döngüler ve stackoverflow istisnaları oluşmaz.

Yaptığım şey ilişkinin bir tarafını kaldırmak. Bu tarafı kaldırmak veya bırakmak ve diğer tarafın sahibi olarak tanımlamak isteyip istemediğinize karar verebilirsiniz. Ayrıca bu taraftan hevesli getirmeyi de kaldırmanız gerekecek.

Hazırda bekletme, çoktan çoğa ilişkilerde alma derinliğini tanımlamak için bir mekanizma verebilirse çok iyi olur.

0

"hibernate.max_fetch_depth" özelliğini istekli getirmeyi sınırlamak için 3 gibi bir şeye ayarlamak isteyebilirsiniz.