2009-07-02 12 views
6

मैं एक जेपीए वस्तु जो इस तरह की एक बहुत-से-अनेक संबंध नहीं है है:मैं जॉइन टेबल से प्रविष्टियों को हटाने के लिए जेपीक्यूएल का उपयोग कैसे करूं?

@Entity 
public class Role { 
    //... 

    @ManyToMany(fetch=FetchType.EAGER) 
    @JoinTable(
    name="RolePrivilege", 
    joinColumns= 
     @JoinColumn(name="role", referencedColumnName="ID"), 
    inverseJoinColumns= 
     @JoinColumn(name="privilege", referencedColumnName="ID") 
    ) 
    private Set<Privilege> privs; 
} 

वहाँ RolePrivilege के लिए एक जेपीए वस्तु नहीं है, तो मुझे यकीन है कि कैसे हटाने के लिए एक JPQL क्वेरी लिखने के लिए नहीं कर रहा हूँ एक भूमिका वस्तु के निजी क्षेत्र से प्रविष्टियां। उदाहरण के लिए, मैंने यह कोशिश की है, लेकिन यह काम नहीं करता है। यह शिकायत करता है कि Role.privs मैप नहीं किया गया है।

DELETE FROM Role.privs p WHERE p.id=:privId 

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

क्या इस तरह की जॉइन टेबल से प्रविष्टियों को निकालने के लिए जेपीक्यूएल लिखना भी संभव है? यदि नहीं, तो मैं केवल सभी भूमिका वस्तुओं को लोड कर सकता हूं और प्रत्येक के निजी संग्रह से प्रविष्टियों को हटा सकता हूं और फिर प्रत्येक भूमिका को कायम रख सकता हूं। लेकिन ऐसा करने के लिए मूर्खतापूर्ण लगता है कि यदि एक साधारण जेपीक्यूएल क्वेरी एक बार में यह सब करेगी।

उत्तर

3

जेपीक्यूएल अपडेट और डिलीट स्टेटमेंट्स को एक इकाई नाम का संदर्भ देने की आवश्यकता है, टेबल नाम नहीं, इसलिए मुझे लगता है कि आपके द्वारा सुझाए गए दृष्टिकोण के साथ आप भाग्य से बाहर हैं।

अपने जेपीए प्रदाता के आधार पर, आप एक साधारण कच्चे एसक्यूएल कथन (100% पोर्टेबल होना चाहिए) का उपयोग करके जॉइनटेबल से प्रविष्टियों को हटा सकते हैं और फिर प्रोग्राम को बेदखल करने के लिए अपने कैश प्रदाता एपीआई के साथ प्रोग्रामेटिक रूप से बातचीत कर सकते हैं। हाइबरनेट में उदाहरण के लिए आप 2 स्तर कैश से सभी "Role.privs" संग्रह समाप्त करने के लिए बेदखल() कॉल कर सकते हैं:

sessionFactory.evictCollection("Role.privs", roleId); //evict a particular collection of privs 
sessionFactory.evictCollection("Role.privs"); //evict all privs collections 

दुर्भाग्य से मैं जेपीए एपीआई साथ काम नहीं करते पर्याप्त निश्चित रूप से जानना एकदम वही है जिसे समर्थित।

2

जावा एक ऑब्जेक्ट उन्मुख भाषा है और ओआरएम का पूरा बिंदु जुड़ने वाली टेबलों और आपके जैसे विवरणों को छिपाना है। नतीजतन परिणामों पर विचार किए बिना एक जॉइन टेबल से हटाना भी अजीब होगा।

नहीं, आप इसे जेपीक्यूएल के साथ नहीं कर सकते हैं, जो कि संस्थाओं के लिए है।

किसी भी अंत में इकाइयों को पुनर्प्राप्त करें और अपने संग्रह साफ़ करें। यह शामिल टेबल प्रविष्टियों को हटा देगा। वस्तु के उन्मुख।

2

मैं भी कई से अधिक संबंधों को हटाने के लिए एक जेपीक्यूएल दृष्टिकोण की तलाश में था (एक जॉइनिंग टेबल में निहित)। जाहिर है, ओआरएम में टेबल की कोई अवधारणा नहीं है, इसलिए हम DELETE संचालन का उपयोग नहीं कर सकते ... लेकिन मेरी इच्छा है कि इन मामलों के लिए एक विशेष ऑपरेटर था। कुछ लिंक और यूएनLINK की तरह। शायद एक भविष्य की सुविधा?

वैसे भी, मैं इस आवश्यकता को प्राप्त करने के लिए जो कर रहा हूं वह इकाई बीन्स में लागू संग्रहों के साथ काम करना है, जो कई से कई संबंधों को मानचित्रित करते हैं।

उदाहरण के लिए, अगर मैं एक वर्ग छात्र जो पाठ्यक्रम के साथ एक बहुत-से-अनेक संबंध नहीं मिला:

@ManyToMany 
private Collection <Courses> collCourses; 

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

हालांकि मेरी मुख्य चिंता प्रदर्शन है।एक ओआरएम को सभी ऑब्जेक्ट्स (यदि मुझे गलत नहीं लगता है) का एक बड़ा कैश रखना है, लेकिन इसे तेजी से काम करने के लिए भी उपयोग करना है, तो मुझे आश्चर्य है कि संग्रह से सभी तत्वों को पुनर्प्राप्त करना वास्तव में प्रभावी है ...

क्योंकि मेरे लिए यह एक तालिका से रजिस्ट्री को पुनर्प्राप्त करने के रूप में बहुत अक्षम है और उन्हें एक क्वेरी भाषा के बजाय शुद्ध जावा का उपयोग करके फ़िल्टर करना है जो आंतरिक डीबी इंजन (एसक्यूएल, जेपीक्यूएल ...) के साथ प्रत्यक्ष या परोक्ष रूप से काम करता है।

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

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