2009-06-03 8 views
6

हाइबरनेट जावाडोक बताता है कि Session.update(Object o) अपवाद उठाएगा यदि पहले से ही o का लगातार उदाहरण है, है ना?हाइबरनेट * अप * फेंकना नहीं है (मुझे लगता है कि यह चाहिए)

If there is a persistent instance with the same identifier, an exception is thrown.

हालांकि, जब मैं इसे चलाता हूं तो निम्न कोड कुछ भी नहीं फेंकता है। और मुझे लगता है कि यह चाहिए!

Email email = new Email("andre", "girafa", "hi"); 

Session session = factory.openSession(); 
Transaction tx = session.beginTransaction(); 

session.save(email); 
session.update(email); 
session.update(email); 

tx.commit(); 

// didn't throw... Let's try again 

tx = session.beginTransaction(); 

session.update(email); 
session.update(email); 

tx.commit(); 
session.close(); 

// still nothing! :(

आप कह सकते हैं के रूप में, दो बार मैं कई update() रों करने की कोशिश, लेकिन अभी भी हाइबरनेट का मुझ पर आसान लेने।

किसी के पास एक झटका है क्यों?

संपादित करें: ऐसा लगता है कि यह केवल यदि एक और बराबर वस्तु,, email2email के रूप में एक ही आईडी से फेंक उदाहरण के लिए। मुझे लगता है कि प्रलेखन थोड़े मैला था।

+0

हां! दस्तावेज़ कभी इसे स्पष्ट नहीं लिखना चाहते हैं और यह मुझे इस सवाल पर ले जाता है! – GMsoF

उत्तर

8

हाइबरनेट में अद्यतन SQL भाषा में अद्यतन नहीं है। हाइबरनेट एसक्यूएल UPDATEs स्वचालित रूप से सत्र ऑब्जेक्ट में राज्य कैश के माध्यम से हैंडल करता है।

लेकिन यह केवल वर्तमान सत्र में लोड की गई इकाइयों के लिए है। यह विधि, session.update (ऑब्जेक्ट) किसी अन्य स्तर से वर्तमान सत्र तक ऑब्जेक्ट को ट्रैक करने और संभवतः अंत में अद्यतन करने के लिए ऑब्जेक्ट को जोड़ने के लिए है।

आपके मामले में यह सिर्फ एक एनओयूपी है। यह sourly फेंक अगर करेंगे:

Email email = new Email("andre", "girafa", "hi"); 

Session session = factory.openSession(); 
Transaction tx = session.beginTransaction(); 

int id = session.save(email); 
Email anotherEmail = new Email("", "", ""); 
anotherEmail.id = id; 

session.update(anotherEmail); // will throw 

आप Hibernate reference पर अद्यतन विधि अर्थ विज्ञान के बारे में अधिक पढ़ सकते हैं।

+0

यह स्पष्ट उदाहरण के साथ एक बेहतर समाधान है! – GMsoF

0

क्या आप session.flush() के साथ प्रयास कर सकते हैं? यह देखने के लिए कि क्या अपवाद उठाता है (कभी-कभी फ्लश मोड के आधार पर डेटा फ़्लश डेटा नहीं हो सकता है)।

हालांकि मैं कहूंगा कि अपवाद केवल तभी फेंक दिया गया है जब ऑब्जेक्ट को वर्तमान सत्र के दायरे से बाहर अपडेट किया गया था, मान लें कि एक समवर्ती ग्राहक द्वारा।

6

कोई त्रुटि नहीं क्योंकि यह वही उदाहरण है जिसे आप अपडेट कर रहे हैं।

त्रुटि में फेंक दिया गया है यदि सत्र में एक अलग लगातार उदाहरण मौजूद है और आप अद्यतन() को अद्यतन करने का प्रयास करते हैं।

+0

उन्हें हर बार –

+1

प्राप्त करता है मुझे लगता है कि यह 'लगातार निरंतर उदाहरण' नहीं है, यह 'अलग अलग उदाहरण' है। – GMsoF

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