में पदानुक्रमों का कुशल प्रतिनिधित्व मुझे हाइबरनेट में ऑब्जेक्ट पदानुक्रम का प्रतिनिधित्व करने में कुछ परेशानी हो रही है। मैंने चारों ओर खोज की है, और इस तरह के या इसी तरह के किसी भी उदाहरण को खोजने में कामयाब नहीं रहा है - अगर यह एक आम सवाल है तो आपको माफ़ी है।हाइबरनेट
मेरे पास दो प्रकार हैं जिन्हें मैं हाइबरनेट: समूह और आइटम का उपयोग करना जारी रखना चाहता हूं।
* समूहों को उनके नाम और उनके माता-पिता के संयोजन से विशिष्ट रूप से पहचाना जाता है।
* समूहों को कई पेड़ों में व्यवस्थित किया जाता है, जैसे कि प्रत्येक समूह में शून्य या एक अभिभावक समूह होता है।
* प्रत्येक आइटम शून्य या अधिक समूह का सदस्य हो सकता है।
आदर्श रूप में, मैं एक दो-तरफा संबंध मुझे पाने के लिए अनुमति देता है चाहते हैं:
* सभी समूह है कि एक आइटम
* सभी आइटम है कि एक विशेष समूह या उसके वंश के एक सदस्य हैं का एक सदस्य है।
मुझे यूआई पर प्रदर्शित करने के लिए शीर्ष से समूह के पेड़ को पार करने में भी सक्षम होना चाहिए।
बुनियादी वस्तु संरचना आदर्श रूप इस प्रकार दिखाई देगा:
मूल रूप से, मैं सिर्फ बनाया था एक सरल द्वि-दिशात्मक कई-से-अनेक आइटम और समूह, ऐसी है कि बीच के रिश्ते को एक में सभी आइटम प्राप्त करने में कठिनाई समूह पदानुक्रम आवश्यक प्रत्यावर्तन पेड़, और एक आइटम के लिए समूह लाते एक सरल गेटर, यानी था:
class Group {
...
private Set<Item> items;
private Set<Group> children;
...
/** @return all items in this group and its descendants */
Set<Item> getAllItems() {
Set<Item> allItems = new HashSet<Item>();
allItems.addAll(this.items);
for(Group child : this.getChildren()) {
allItems.addAll(child.getAllItems());
}
return allItems;
}
/** @return all direct children of this group */
Set<Group> getChildren() {
return this.children;
}
...
}
class Item {
...
private Set<Group> groups;
/** @return all groups that this Item is a direct member of */
Set<Group> getGroups() {
return this.groups;
}
...
}
बहरहाल, यह, या पुन: प्राप्त करने के लिए कई वंशजों के साथ एक समूह में आइटम लाने के लिए कई डेटाबेस अनुरोधों के परिणामस्वरूप पूरा समूह यूआई में प्रदर्शित करने के लिए पेड़। यह बहुत अक्षम है, खासतौर से गहरे, बड़े समूह के पेड़ों के साथ। क्या हाइबरनेट में इस संबंध का प्रतिनिधित्व करने का एक बेहतर या मानक तरीका है?
क्या मैं कुछ भी गलत या बेवकूफ कर रहा हूं?
मेरी केवल दूसरे सोचा अब तक यह था: एक अद्वितीय "पथ" स्ट्रिंग जो एक समूह के पूरे वंश को निर्दिष्ट करता है, जैसे के साथ समूह की आईडी, माता-पिता और नाम फ़ील्ड बदलें:
/rootGroup
/rootGroup/aChild
/rootGroup/aChild/aGrandChild
समूह और आइटम के बीच जुड़ने वाली तालिका में समूह_पथ और item_id होगा।
यह तुरंत दो मुद्दों को हल करता है जो मैं पहले पीड़ित था:
1. पूरे समूह पदानुक्रम को एक ही क्वेरी में डेटाबेस से लाया जा सकता है और स्मृति में पुनर्निर्मित किया जा सकता है।
2. एक समूह या उसके वंश में सभी आइटम को पुनः प्राप्त करने के लिए, हम जहां group_path = 'एन' या 'एन /%' की तरह group_path
हालांकि, इस हाइबरनेट का उपयोग कर के बिंदु को हराने के लिए लगता है group_item से चुन सकते हैं। सभी विचारों का स्वागत है!
Knuth का maxim नहीं है "समयपूर्व अनुकूलन सभी बुराइयों की जड़ है?" –
मुझे लगता है, कई समान मामलों में, यह बड़ी इन-मेमोरी डेटास्ट्रक्चर की समस्या नहीं है बल्कि SQL संचालन की बढ़ती संख्या है। जबकि प्रत्येक परिचालन वास्तव में तेज़ है, जटिल ऑब्जेक्ट-नेट में प्रश्नों की संख्या और संचार की विलंबता को क्रॉल करने के लिए एक आवेदन मिल जाएगा। इस मामले में मैं आमतौर पर नेटवर्क के बड़े हिस्सों की पहचान करना पसंद करता हूं और तकनीकों का उपयोग (पूर्व) उन्हें जितनी जल्दी संभव हो सकता हूं (नीचे अतिरिक्त उत्तर देखें)। मेमोरी आसानी से पुन: उपयोग किया जा सकता है। –
@Mathew हाँ, मुझे विश्वास है कि उसने ऐसा कहा था। @Ralf हम सिर्फ जानकारी नहीं है। मैं बस दोनों अड्डों को कवर करने की कोशिश कर रहा हूँ। –