सेट करें मेरे पास जेनरेट आईडी के साथ एक टेबल है, लेकिन कुछ मामलों में मैं इसे अपने आप सेट करना चाहता हूं। क्या मैं, किसी भी तरह, @GeneratedValue को अनदेखा करने के लिए हाइबरनेट को मजबूर कर सकता हूं?@Id @GeneratedValue लेकिन अपना आईडी मान
उत्तर
यह एक 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
hibernate.org मंच पर, एक उपयोगकर्ता है जिसने इस जेनरेटर क्लास को इस सटीक परिदृश्य के लिए लिखा है: https://forum.hibernate.org/viewtopic.php?p=2404032 – tmarthal
मैंने इस अनुरोध पर एक समाधान की तलाश में रुका सटीक एक ही सवाल (हालांकि मैं हाइबरनेट के बजाय एक्लिप्ससेंक का उपयोग कर रहा हूं)। मैंने कस्टम आईडी जनरेटर का उपयोग शुरू किया लेकिन (कम से कम मेरे ग्रहण लिंक परिदृश्य में) एक समस्या है: मुझे कैसे पता चलेगा कि ऑब्जेक्ट को बनाए रखने की आवश्यकता है या नहीं, पहले से ही एक आईडी है या नहीं? मेरे पास मेरे कस्टम आईडी जेनरेटर में इकाई ऑब्जेक्ट नहीं है। इसलिए यदि मैं ऑब्जेक्ट में नहीं है तो मैं यह निर्धारित नहीं कर सकता कि मुझे एक नई आईडी उत्पन्न करने की आवश्यकता है या नहीं। या अगर मैं सिर्फ आईडी को वापस लौटाता हूं (या शायद शून्य या जो भी आवश्यक हो)। – Jens
इससे पहले मेरी टिप्पणी में एड-ऑन करें: ईक्लीप्स लिंक में, जब कोई अनुक्रम जनरेटर बनाते हैं तो 'चाहिएअल्वेवे ओवरराइडएक्सिंगवैल्यू' नामक एक विधि है जिसे ओवरराइड किया जा सकता है। यह एक संभावित समाधान प्रतीत होता है। हालांकि यह चीजों को ओवरराइड करने में थोड़ा असहज महसूस करता है, लेकिन मैं पूरी तरह से पर्यवेक्षण नहीं करता हूं और इस [बग] के अलावा अन्य दस्तावेज भी नहीं मिला (https://bugs.eclipse.org/bugs/show_bug.cgi?id=300556) प्रवेश। – Jens
आपके लिए केस का उपयोग करने के लिए, आप मैन्युअल रूप से इस उपयोगकर्ता को जोड़ सकते हैं। ऐसा करने का एक तरीका है "./import.sql" (आपके क्लासपाथ में) नाम की फ़ाइल पर सम्मिलन ऑपरेशन डालना। सत्र फैक्ट्री शुरू होने पर हाइबरनेट इन बयानों को निष्पादित करेगा।
@ ईमानुअल बर्नार्ड उन्होंने कहा: ** लेकिन, कुछ मामलों में, ** मैं इसे अपने आप सेट करना चाहता हूं। यदि आप परिभाषित करते हैं कि हाइबरनेट को एक इकाई को कैसे सहेजना चाहिए ("/.import.sql" फ़ाइल के माध्यम से), तो इसकी स्वचालित पीढ़ी पहचानकर्ता काम नहीं करेगा, है ना? –
नहीं, यह असंबंधित नहीं है, import.sql सादा एसक्यूएल है ताकि आप जो भी चाहते हैं वह कर सकें, अनुक्रम या तालिका आईडी को अपडेट करने सहित –
जानना अच्छा है (+1) मैं इसे आज़माउंगा। –
के अनुसार हालांकि इस प्रश्न पूछा गया था काफी देर पहले, मैंने सही जवाब इसके लिए this post में @lOranger द्वारा पाया, और साझा करना चाहते थे यह।
यह प्रस्ताव जांचता है कि क्या ऑब्जेक्ट की वर्तमान आईडी null
के अलावा किसी अन्य चीज़ पर सेट है, और यदि ऐसा है, तो यह इसका उपयोग करता है, अन्यथा, यह डिफ़ॉल्ट (या कॉन्फ़िगर) पीढ़ी की रणनीति का उपयोग करके उत्पन्न करता है।
यह सरल, सीधे आगे है, और @Jens द्वारा लाए गए मुद्दे को संबोधित करता है, जिनमें से कोई ऑब्जेक्ट की वर्तमान आईडी पुनर्प्राप्त करने में सक्षम नहीं है।
मैं सिर्फ इसे लागू किया (UUIDGenerator बढ़ा कर), और यह :-D
एक आकर्षण की तरह काम करता अपनी खुद की 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()
- 1. जेपीए एक @GeneratedValue @Id
- 2. jQuery आईडी चयनकर्ता ("#id") ऐरे
- 3. REST URL नामकरण सम्मेलन/आइटम/{आईडी} बनाम/आइटम? Id = {id}
- 4. बाईपास GeneratedValue हाइबरनेट में
- 5. भी ढूँढना या विषम ID मान
- 6. उपयोगकर्ता को समूह में जोड़ें लेकिन "id"
- 7. जब भी मैं अपना मान
- 8. लूप और उच्चतम आईडी मान
- 9. jquery यदि div id id
- 10. छिपी हुई आईडी मान
- 11. @ + id/android: list और @ + id/list
- 12. पास आईडी, लेकिन इसे वास्तविक यूआरएल
- 13. जेपीए @TableGenerator का उपयोग कर अनुक्रम आईडी के बीच क्या अंतर है, @GeneratedValue बनाम डेटाबेस Auto_Increment
- 14. XPath स्ट्रिंग जो एक विशिष्ट आईडी मान
- 15. NSObjectInaccessibleException डीबगिंग - आईडी के साथ NSManagedObject ID: 0x123456789 को
- 16. एसक्यूएल: एक मान का योग लेकिन केवल अलग आईडी के लिए - सशर्त राशि?
- 17. स्ट्रिंग आईडी जनरेटर
- 18. थ्रेड ID रही
- 19. अनुमत HTML 4.01 आईडी मान regex
- 20. PHP से बुलाया MySQL MAX (id) अजीब मान
- 21. Datanucleus gae.pk-id makePersistent
- 22. क्यों क्वेरी नहीं है चयनकर्ता ('# id') document.getElementById ('id') पर नक्शा?
- 23. स्तंभ शून्य लेकिन डिफ़ॉल्ट मान नहीं NULL
- 24. स्पिंक्स एक auto_increment id
- 25. @IdClass गैर प्राइमेटिव @Id
- 26. विरासत के माध्यम से Hibernate @Id
- 27. दो एक ही उपयोगकर्ता ID
- 28. MySQL WHERE `id` IN (...)
- 29. div id
- 30. हाइबरनेट: कैसे @GeneratedValue पर काम करता है
क्या आपने इसे आजमाया है, देखें कि क्या होता है? – skaffman
हां, हाइबरनेट परवाह नहीं है कि आईडी सेट है या नहीं - वैसे भी एक मूल्य उत्पन्न होता है। – woezelmann
मुझे पता था कि मैंने इसे कहीं पहले देखा होगा: http://stackoverflow.com/questions/89439/bypass-generatedvalue-in-hibernate - 'persist()' – skaffman