2010-03-03 13 views
9

में फोर्स अपडेट मैं हाइबरनेट को इकाई उदाहरण को अद्यतन करने के लिए कैसे मजबूर कर सकता हूं भले ही इकाई गंदे न हो? मैं हाइबरनेट 3.3.2 जीए, हाइबरनेट एनोटेशन और हाइबरनेट एंटिटी मैनेजर बीटीडब्ल्यू का उपयोग कर रहा हूं। मैं वास्तव में हाइबरनेट को जेनेरिक अपडेट स्टेटमेंट निष्पादित करना चाहता हूं भले ही इकाई पर कोई संपत्ति बदली न हो।हाइबरनेट

मुझे इसकी आवश्यकता है क्योंकि कुछ ईवेंट श्रोताओं को पहली बार चलाने के लिए कुछ अतिरिक्त काम करने के लिए बुलाया जाना चाहिए।

धन्यवाद!

उत्तर

10

ठीक है - इसे स्वयं मिला।

Session session = (Session)entityManager.getDelegate(); 
session.evict(entity); 
session.update(entity); 
+0

+1 मैंने पहले चाल के बारे में सुना था, लेकिन यह याद नहीं कर सके। – ewernli

+0

साफ चाल लेकिन मैंने अभी कोशिश की है और यह इंगित करने के लिए यह उचित है कि यदि आप इस प्रतिबद्धता को "entity.childEntity" में रुचि रखते हैं तो यह निर्भर नहीं होगा - यह निर्भरता पेड़ को तोड़ देता है। –

0

कोशिश em.flush() जो EJB 3.0 संस्थाओं, जो भी जेपीए समान का उपयोग करता है 3.2.2 जीए हाइबरनेट करने के लिए प्रयोग किया जाता है: यह काम कर देता है। यदि यह सामान्य रूप से काम नहीं करता है, लेनदेन में फ्लश का उपयोग करें।

+1

डेटाबेस के साथ मेमोरी में परिवर्तनों को सिंक्रनाइज़ करने के लिए फ्लश बलों को हाइबरनेट करें। लेकिन अगर हाइबरनेट इकाई को गंदा मानता नहीं है, तो अब तक मुझे कुछ भी फ्लश नहीं होगा। – ewernli

+0

हाँ - फ्लश() आईएनजी यहां मदद नहीं करता है क्योंकि कोई बदलाव नहीं किया जाता है – gubrutz

1
session.evict(entity); 
session.update(entity); 

अच्छी चाल, लेकिन इसे कुछ स्वचालन कोड में रखने से पहले क्षणिक वस्तुओं के लिए देखें। यात्रियों के लिए मैं तो StaleStateObjectException

3

है यात्रियों के लिए, आप जाँच कर सकते हैं

if(session.contains(entity)) { 
    session.evict(entity); 
} 
session.update(entity);