10

मेरे कोड उपयोगकर्ता से संबंधित सभी जानकारी को पुन: प्राप्त:हाइबरनेट प्रॉक्सी सक्रिय नहीं कर सका - कोई सत्र

SessionFactory sessionFactory = HibernateUtilities.configureSessionFactory(); 
Session session = sessionFactory.openSession(); 
UserDetails ud = null; 
Set<Address> userAddress = null; 

try { 
    session.beginTransaction(); 
    ud = (UserDetails) session.get(UserDetails.class, 1); 
    userAddress = ud.getAddresses(); 
    session.getTransaction().commit(); 
} catch (HibernateException e) { 
    e.printStackTrace(); 
    session.getTransaction().rollback(); 
} finally { 
    session.close(); 
} 

System.out.println(ud.getName()); 

for(Address addr: userAddress){ 
    System.out.println("State " + addr.getState()); 
} 

ud.getAddresses() बस उपयोगकर्ता की Address तों का एक सेट देता है।

मेरा प्रश्न है: क्यों ud वस्तु अभी भी अपने मूल्य है (जैसे, नाम) भले ही सत्र पहले से ही बंद कर दिया है? getAddresses()UserDetails कक्षा का एक उदाहरण चर है। लेकिन मैं इसका मूल्य क्यों नहीं प्राप्त कर सकता हूं लेकिन मैं UserDetails कक्षा के नियमित आवृत्ति चर पुनर्प्राप्त कर सकता हूं?

ud.getAddresses() एक @EmbeddedCollection है।

+0

"@EmbeddedCollection" - क्या आपका मतलब है @ @ ElementCollection'? –

उत्तर

15
userAddress = ud.getAddresses(); 
session.getTransaction().commit(); 
for(Address addr: userAddress) { 

working with lazy associations के लिए हाइबरनेट प्रलेखन स्पष्ट रूप से एक त्रुटि के रूप में उपयोग कर सकते इस तरह बाहर कहता है। सत्र अभी भी खुला होने पर आप आलसी से जुड़े ऑब्जेक्ट्स के साथ बातचीत कर सकते हैं। दस्तावेज का वह हिस्सा किसी ऑब्जेक्ट के ऐसे आलसी जुड़े सदस्यों तक पहुंचने के विकल्प भी प्रदान करता है और हम अपने अनुप्रयोगों में उपयोग किए गए मानदंडों में शामिल होने के रूप में fetch मोड निर्दिष्ट करना पसंद करते हैं।

+0

तो इसकी प्रकृति से, यह वास्तव में डेटाबेस से पूछताछ करता है जब मैं ud.getAddresses() को कॉल करता हूं? – KyelJmD

3

कक्षाओं के सभी आदिम गुण तुरंत लोड हो जाते हैं, जब तक आप बाइटकोड संवर्द्धन का उपयोग नहीं कर रहे हैं, वे आलसी नहीं हो सकते हैं। आपके संग्रह जैसे वास्तविक संघ आलसी हो सकते हैं।

+0

एक और कक्षा के बारे में कैसे? क्या यह आलसी प्रारंभिक माना जाता है? – KyelJmD

+0

* हां *, अगर यह एमटीओ की बात आती है। और * शायद * अगर यह ओटीओ की बात आती है। –

+0

एमटीओ और ओटीओ का क्या अर्थ है? – KyelJmD

11

मैं जेपीए/हाइबरनेट में एक ही मुद्दा का सामना करना पड़ा है, और वहाँ इस समस्या को हल करने के लिए 2 तरीके हैं:

1/बंद निम्नलिखित के रूप में, डिफ़ॉल्ट रूप से आलसी करें:

@Entity 
@Proxy(lazy = false) 
public class Project { 
... 
} 
बेशक

, इस तरह प्रदर्शन की समस्या के कारण अनुशंसित नहीं है, इसलिए आप दूसरे तरीके से जा सकते हैं।

2/आप अपने विधि की शुरुआत में @Transactional रख सकते हैं, यह मदद कर सकते हैं सत्र रहने के लिए, या किसी अन्य समझ है, यह निम्नलिखित के रूप में, सत्र का कर्तव्य हाइबरनेट को पारित:

@Test 
@Transactional 
public void testSaveGroup() { 
    Department g = new Department(); 
    g.setName("XDG"); 
    assertNull(g.getId()); 
    this.groupRepo.save(g); 
    assertNotNull(g.getId()); 
    System.out.println(g.getId()); 
    Project dummyPrj = new Project(123L, "KSTA", new Date(), "NEW", "Helm AG", g); 
    this.projectRepo.save(dummyPrj); 
    // verify 
    List<Department> lst = this.groupRepo.findAll(); 
    Project savedPrj = this.projectRepo.getOne(123L); 
    Assert.assertEquals("XDG", savedPrj.getGroup().getName()); 
} 

मेरा जवाब देर हो चुकी है, लेकिन किसी और की मदद करने की उम्मीद है :)

+0

धन्यवाद, @ ट्रान्ससेनल ने मेरे लिए काम किया –

संबंधित मुद्दे