2010-11-22 15 views
13

क्या हाइबरनेट एक लिंक्ड हैशसेट के क्रम को सुरक्षित रखता है और यदि ऐसा है, तो कैसे? यदि यह डेटाबेस के प्रकार पर निर्भर करता है, तो मैं PostgreSQL के लिए यह जानना चाहता हूं।क्या हाइबरनेट एक लिंक्ड हैशसेट के आदेश को सुरक्षित रखता है और यदि ऐसा है, तो कैसे?

पृष्ठभूमि:

मुझे पता है कि एक LinkedHashSet के लिए है, और कारण है कि मैं इस पूछ रहा हूँ है, क्योंकि मैं कुछ कार्यों मैं एक 'logError' तालिका एक है कि करने के लिए अमल के नाम लॉगिन कर रहा हूं कुछ 'functionName' तालिका से कई से अधिक संबंध। मुझे इन फ़ंक्शंस को उसी क्रम में रहने की आवश्यकता है जब मैंने उन्हें निष्पादित किया था, इसलिए पहले मुझे संबंधित 'functionName' ऑब्जेक्ट्स मिलते हैं, उन्हें एक LinkedHashSet (विफल होने वाले प्रत्येक फ़ंक्शन के बाद) में डाल दिया जाता है और फिर मैं 'logError' ऑब्जेक्ट को जारी रखता हूं।

अब जब मुझे डेटाबेस से 'logError' ऑब्जेक्ट मिलता है, तो क्या इसका अभी भी आदेश दिया जाएगा? और यदि ऐसा है, तो मैं उत्सुक था कि यह हाइबरनेट द्वारा कैसे किया जाता है।

+1

क्या आपने @OrderColumn के साथ टिप्पणी करने की कोशिश की है? (हो सकता है कि यह एक जेपीए एनोटेशन है) – willcodejavaforfood

उत्तर

13

पहला: मुझे लगता है कि आप दो इकाइयों के बीच संबंधों के बारे में बात कर रहे हैं।

@Entity 
public class A { 
@ManyToMany 
    @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "A_fk") }, inverseJoinColumns = { @JoinColumn(name = "B_fk") }) 
    private Set<B> bSet = new LinkedHashSet<B>(); 
} 

की तरह कुछ हाइबरनेट से ही क्रम बनाए रखने नहीं है!

आप इस्तेमाल किया वर्गों पर एक नज़र है, तो जब इकाई A डेटाबेस से भरी हुई है, तो SetbSet प्रकार PersistentSet, जो किसी अन्य Set के चारों ओर एक आवरण है की है, और यह (मेरे मामले में) एक सामान्य है HashSet। (HashSet उसके तत्वों का क्रम बनाए रखने के नहीं है।)

यहां तक ​​कि अगर हाइबरनेट List या LinkedHashSet इस्तेमाल किया, यह अभी भी प्राकृतिक (इसकी गारंटी नहीं) डेटाबेस आदेश पर कार्यान्वयन के आधार के लिए अनुचित है। MySQL के लिए यह किसी प्रकार का विरोधी पैटर्न है।

लेकिन आप अपनी सॉर्टिंग स्पष्ट करने के लिए @Sort एनोटेशन (org.hibernate.annotations.Sort) का उपयोग कर सकते हैं। उदाहरण के लिए:

@OneToMany(mappedBy = "as") 
@Sort(type = SortType.COMPARATOR, comparator = MyBComparator.class); 
public SortedSet<C> cs; 

@see: Ordering return of Child objects in JPA query


Łukasz Rzeszotarski द्वारा 1th सितं, 2012 को जोड़ा गया:

लेकिन हम @Sort एनोटेशन का उपयोग करने में छँटाई वस्तुओं का कारण बनता है याद स्मृति (जेवीएम) और एसक्यूएल में नहीं। इसके बजाय हम @OrderBy एनोटेशन का उपयोग कर सकते हैं जो एसक्यूएल सर्वर पक्ष पर सॉर्टिंग का कारण बनता है। इन दोनों टिप्पणियों में मेरे (Łukasz Rzeszotarski) राय में एक कमजोरी है जो डिफ़ॉल्ट रूप से ऑर्डर करने की स्थापना करती है। I (Łukasz Rzeszotarski) क्लॉज द्वारा ऑर्डर किए जाने पर ऑर्डर किए जाने पर अपने लिंक्ड हैशसेट कार्यान्वयन का उपयोग करने के बजाय हाइबरनेट करेगा।

@see: Hibernate ordering in sql

+3

@ लुकसज़ रेजेज़ोटर्स्की है: यदि आप इस तरह से किसी के पोस्ट को फिर से संपादित करते हैं, तो कम से कम स्पष्ट करें कि यह आपका कथन था, न कि मूल लेखकों में से एक! – Ralph

+0

यह सचमुच उत्तर है यदि आपके पास वास्तव में सामान्य मानचित्र है और इकाई संबंध नहीं है और आप केवल 'LinkedHashMap' – Enerccio

+0

@Enerccio के माध्यम से ऑर्डर को संरक्षित करना चाहते हैं: प्रश्न यह है कि लिंक्ड हैशसेट के ऑर्डर को हाइबरनेट कैसे करें (या नहीं) आप उनके बारे में नहीं चाहते हैं कि वे एक नक्शा स्टोर करें। अगर आपको लगता है कि मेरा जवाब गलत है (शायद यह है) तो कृपया एक बेहतर सही उत्तर लिखें और मैं अपना एक और अपने आप को हटा दूंगा। – Ralph

0

सेट्स में निहित 'ऑर्डर' नहीं है, न ही डेटाबेस टेबल हैं - जब आप डेटा पूछते हैं तो आप एक ऑर्डर लागू कर सकते हैं, लेकिन जब तक कि आप उस ऑर्डर को सुरक्षित न करें (उदाहरण के लिए पंक्तियों को एक-एक करके प्राप्त करना और उन्हें ऑर्डर करना एक लिंक्ड सूची की तरह कंटेनर) तो लौटाया डेटा भी अनियंत्रित होगा।

+1

लिंक्ड हैशसेट में सम्मिलन आदेश – willcodejavaforfood

0

जब मैं मदों की एक सूची के आदेश जारी रहती है की जरूरत है, मैं एक Map और नहीं एक List का उपयोग करें।

@OneToMany(fetch = FetchType.EAGER, mappedBy = "rule", cascade = CascadeType.ALL) 
@MapKey(name = "position") 
private Map<Integer, RuleAction> actions    = LazyMap.decorate(new LinkedHashMap<>(), FactoryUtils.instantiateFactory(RuleAction.class, new Class[] { Rule.class }, new Object[] { this })); 

इस Java उदाहरण में, positionRuleAction की एक पूर्णांक संपत्ति इसलिए क्रम कि जिस तरह से एक समान होती है है। मुझे लगता है कि C# में यह समान दिखता है।

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

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