2010-01-21 12 views
22

सेट करें मेरे पास जेनरेट आईडी के साथ एक टेबल है, लेकिन कुछ मामलों में मैं इसे अपने आप सेट करना चाहता हूं। क्या मैं, किसी भी तरह, @GeneratedValue को अनदेखा करने के लिए हाइबरनेट को मजबूर कर सकता हूं?@Id @GeneratedValue लेकिन अपना आईडी मान

+0

क्या आपने इसे आजमाया है, देखें कि क्या होता है? – skaffman

+5

हां, हाइबरनेट परवाह नहीं है कि आईडी सेट है या नहीं - वैसे भी एक मूल्य उत्पन्न होता है। – woezelmann

+2

मुझे पता था कि मैंने इसे कहीं पहले देखा होगा: http://stackoverflow.com/questions/89439/bypass-generatedvalue-in-hibernate - 'persist()' – skaffman

उत्तर

6

यह एक overkill हो सकता है लेकिन आप अपने खुद के CustomIDGenerator जो शायद उपवर्गों कहना हाइबरनेट की AutoGenerator और तरीकों जहां अगली कक्षा वस्तु की आईडी सेट कर सकते हैं के एक जोड़े को उजागर करता है, तो उदाहरण के लिए

उत्पन्न किया जा करने के लिए लिख बारे में सोचा है
class MyGenerator extends .... { 

public void setIdForObject(Class clazz, Long id) { 
    //once you use this API, the next time an object of 
    //type clazz is saved the id is used 
} 

public void setIdForObject(Class clazz, Long id, Matcher matcher) { 
    //once you use this API, the next time an object of 
    //type clazz is saved and the matcher matches yes the id will be 
    //assigned. Your matcher can match properties like name, age etc 
    //to say the matched object 
} 
} 

यह जटिल हो सकता है, लेकिन कम से कम संभव है hibernate doco

+0

hibernate.org मंच पर, एक उपयोगकर्ता है जिसने इस जेनरेटर क्लास को इस सटीक परिदृश्य के लिए लिखा है: https://forum.hibernate.org/viewtopic.php?p=2404032 – tmarthal

+0

मैंने इस अनुरोध पर एक समाधान की तलाश में रुका सटीक एक ही सवाल (हालांकि मैं हाइबरनेट के बजाय एक्लिप्ससेंक का उपयोग कर रहा हूं)। मैंने कस्टम आईडी जनरेटर का उपयोग शुरू किया लेकिन (कम से कम मेरे ग्रहण लिंक परिदृश्य में) एक समस्या है: मुझे कैसे पता चलेगा कि ऑब्जेक्ट को बनाए रखने की आवश्यकता है या नहीं, पहले से ही एक आईडी है या नहीं? मेरे पास मेरे कस्टम आईडी जेनरेटर में इकाई ऑब्जेक्ट नहीं है। इसलिए यदि मैं ऑब्जेक्ट में नहीं है तो मैं यह निर्धारित नहीं कर सकता कि मुझे एक नई आईडी उत्पन्न करने की आवश्यकता है या नहीं। या अगर मैं सिर्फ आईडी को वापस लौटाता हूं (या शायद शून्य या जो भी आवश्यक हो)। – Jens

+0

इससे पहले मेरी टिप्पणी में एड-ऑन करें: ईक्लीप्स लिंक में, जब कोई अनुक्रम जनरेटर बनाते हैं तो 'चाहिएअल्वेवे ओवरराइडएक्सिंगवैल्यू' नामक एक विधि है जिसे ओवरराइड किया जा सकता है। यह एक संभावित समाधान प्रतीत होता है। हालांकि यह चीजों को ओवरराइड करने में थोड़ा असहज महसूस करता है, लेकिन मैं पूरी तरह से पर्यवेक्षण नहीं करता हूं और इस [बग] के अलावा अन्य दस्तावेज भी नहीं मिला (https://bugs.eclipse.org/bugs/show_bug.cgi?id=300556) प्रवेश। – Jens

2

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

+0

@ ईमानुअल बर्नार्ड उन्होंने कहा: ** लेकिन, कुछ मामलों में, ** मैं इसे अपने आप सेट करना चाहता हूं। यदि आप परिभाषित करते हैं कि हाइबरनेट को एक इकाई को कैसे सहेजना चाहिए ("/.import.sql" फ़ाइल के माध्यम से), तो इसकी स्वचालित पीढ़ी पहचानकर्ता काम नहीं करेगा, है ना? –

+0

नहीं, यह असंबंधित नहीं है, import.sql सादा एसक्यूएल है ताकि आप जो भी चाहते हैं वह कर सकें, अनुक्रम या तालिका आईडी को अपडेट करने सहित –

+0

जानना अच्छा है (+1) मैं इसे आज़माउंगा। –

4

के अनुसार हालांकि इस प्रश्न पूछा गया था काफी देर पहले, मैंने सही जवाब इसके लिए this post में @lOranger द्वारा पाया, और साझा करना चाहते थे यह।

यह प्रस्ताव जांचता है कि क्या ऑब्जेक्ट की वर्तमान आईडी null के अलावा किसी अन्य चीज़ पर सेट है, और यदि ऐसा है, तो यह इसका उपयोग करता है, अन्यथा, यह डिफ़ॉल्ट (या कॉन्फ़िगर) पीढ़ी की रणनीति का उपयोग करके उत्पन्न करता है।

यह सरल, सीधे आगे है, और @Jens द्वारा लाए गए मुद्दे को संबोधित करता है, जिनमें से कोई ऑब्जेक्ट की वर्तमान आईडी पुनर्प्राप्त करने में सक्षम नहीं है।

मैं सिर्फ इसे लागू किया (UUIDGenerator बढ़ा कर), और यह :-D

1

एक आकर्षण की तरह काम करता अपनी खुद की identifiergenerator/sequencegenerator बनाने

public class FilterIdentifierGenerator extends IdentityGenerator implements IdentifierGenerator{ 

@Override 
public Serializable generate(SessionImplementor session, Object object) 
     throws HibernateException { 
    // TODO Auto-generated method stub 
    Serializable id = session.getEntityPersister(null, object) 
      .getClassMetadata().getIdentifier(object, session); 
    return id != null ? id : super.generate(session, object); 
} 

} 

के रूप में अपने इकाई को बदलना:

@Id 
@GeneratedValue(generator="myGenerator") 
@GenericGenerator(name="myGenerator", strategy="package.FilterIdentifierGenerator") 
@Column(unique=true, nullable=false) 
private int id; 
... 

और persist() का उपयोग करने के बजाय सहेजते समय merge() या update()

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