2009-07-29 14 views
7

और यदि हां, तो वाक्यविन्यास क्या है?क्या एचक्यूएल के साथ कई सारे संगठनों से हटाना संभव है?

मान लें कि मैं फू का एक उदाहरण बार के सभी उदाहरणों से असंबद्ध होना चाहते हैं: एसक्यूएल में यह बस होगा:

delete from FOO_BAR_MAPPING 
where FOO_ID = ? 

HQL में, मैं मान लिया है यह होगा कुछ की तरह:

delete from Bar.foos foos 
where foos.id = :id 

(जहां कम महत्वपूर्ण चीज़ें फू के एक मैप किए गए संग्रह है) लेकिन गलत प्रतीत होता है, दे रही है:

org.hibernate.hql.ast.QuerySyntaxException: Bar.foos is not mapped 

क्या यह एचक्यूएल के साथ भी संभव है?

उत्तर

6

मैप कर सकते हैं अपने विशिष्ट सवाल का जवाब करने के लिए, नहीं, जहाँ तक मुझे पता है कर रहा हूँ यह HQL के साथ संभव नहीं है ।

मुझे लगता है कि आप यहां SQL और HQL मिश्रण कर रहे हैं। एसक्यूएल में, आप वास्तव में रिकॉर्ड्स को "हटाएं" करते हैं, और निश्चित रूप से हाइबरनेट अंततः भी ऐसा करेगा। हालांकि हाइबरनेट/एचक्यूएल को ऑब्जेक्ट-ओरिएंटेड मानसिकता से डिज़ाइन किया गया है, इसलिए इस संदर्भ में "हटाएं" का अर्थ है कि आप ऑब्जेक्ट्स को हटा रहे हैं, न कि एसोसिएशन।

Foo f = session.get(Foo.class, id); 
f.getBars().clear(); 
session.merge(f); 

इस आईडी और आपके द्वारा निर्दिष्ट वस्तु प्राप्त करता है, और समाशोधन यह संग्रह है द्वारा सभी बार संघों निकालता है: इस प्रकार की तरह आमतौर पर आप कुछ करना चाहते हैं। जाहिर है कि आपको काम करने के लिए उचित दिशा में फू-बार्स एसोसिएशन मैप किया गया है।

+2

ध्यान दें कि यह केवल एसोसिएशन तालिका प्रविष्टि को हटा देगा, न कि अंत में तत्व। ऐसा करने के लिए, आपको डिलीट-अनाथ चालू करना होगा। – aperkins

1

एचक्यूएल के साथ अकेले संघों को हटाने संभव नहीं है।

ए) मान लिया जाये कि आप एक ही फू के लिए भी कर रहे हैं और अपने झरना उचित रूप से सेट किया गया है, तो आप उस Foo उदाहरण, स्पष्ट अपने bars के संग्रह को लोड करके सहेज सकते हैं: आप क्या कर सकते हैं, हालांकि, या तो है।

बी) आप एक से अधिक से bars स्पष्ट करने के लिए प्रयास कर रहे हैं Foos आप HQL

के बजाय एक SQL क्वेरी
संबंधित मुद्दे