हाइबरनेट ऑटो इंक्रीमेंट आईडी


85

मेरे पास एनोटेशन के साथ हाइबरनेट का उपयोग करके एक j2ee एप्लिकेशन है। मैं अपने पूजो क्लास में आईडी फ़ील्ड को ऑटो इंक्रीमेंट या ऑटो जेनरेट करने के लिए कैसे सेट करूं। और बीन जोड़ने में क्या मैं अपने बीन नल में उस क्षेत्र को छोड़ दूं?

जवाबों:


160
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

और आप इसे null( 0) जारी रखने पर छोड़ दें । ( nullयदि आप Integer/ Longरैपर का उपयोग करते हैं )

कुछ मामलों में AUTOरणनीति को हल करने के SEQUENCEलिए IDENTITYया की तुलना में हल करने के लिए हल किया जाता है TABLE, इसलिए आप इसे मैन्युअल रूप से IDENTITYया TABLE(अंतर्निहित डेटाबेस के आधार पर) सेट करना चाहते हैं ।

ऐसा लगता है SEQUENCE+ अनुक्रम का नाम निर्दिष्ट करने के लिए काम किया।


मेरी आईडी टाइप स्ट्रिंग की है। मैं इसे क्या सेट करूँगा। क्योंकि मुझे यह त्रुटि मिलती है। इसके कारण: javax.el.ELException: org.hibernate.exception.SQLGrammarException: अगला अनुक्रम मान प्राप्त नहीं कर सका
cedric

4
autoincrement का मतलब है कि यह एक संख्या है जो बढ़ी हुई है। स्ट्रिंग में वृद्धि नहीं की जा सकती। कॉलम को
अंतर

डेटाबेस में myid कॉलम टाइप नंबर का होता है। और मैंने पहले से ही अपनी आईडी को अपने पूजो में बदल दिया था। मुझे त्रुटि अनुक्रम मौजूद नहीं है
cedric

2
ओरेकल के लिए, SEQUENCE ऑटोइन्क्रिमेंट के सबसे नजदीक है। जब तक आप हाइबरनेट को अपना स्कीमा उत्पन्न नहीं करने देते, आपको समय से पहले अनुक्रम बनाना होगा। यदि आपको लगता है कि आप किसी बिंदु पर कई डेटाबेस का समर्थन कर सकते हैं, तो TABLE का उपयोग करें।
ब्रायन डिटेलिंग

2
पहचान का उपयोग न करें, ओरेकल पहचान का समर्थन नहीं करता है, यह अनुक्रम का समर्थन करता है।
जुआनज़े

33

इसे निम्नानुसार करें: -

@Id
@GenericGenerator(name="kaugen" , strategy="increment")
@GeneratedValue(generator="kaugen")
@Column(name="proj_id")
  public Integer getId() {
    return id;
 }

आप कजेन के बजाय किसी भी मनमाने नाम का उपयोग कर सकते हैं। यह अच्छी तरह से काम किया, मैं कंसोल पर नीचे दिए गए प्रश्नों को देख सकता था

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)

यह मेरे लिए काम करता है। लेकिन इसने मुझे आईडी मान सेट नहीं करने दिया। मैंने पूर्णांक या इंट के साथ सेट करने की कोशिश की, लेकिन यह कभी भी अधिकतम उपयोग करता है। मुझे क्या करना चाहिए?
desudesudesu

उपयोग @GenericGenerator (नाम = "incrementId", रणनीति = "सौंपा") @GeneratedValue (जनरेटर = "incrementId") यदि आप आईडी तो पास नहीं यह 0. हो जाएगा अपने own.But द्वारा सेट आईडी पर आप की अनुमति देगा।
रविकांत

@ कौशिक लेले क्या रणनीति = "वेतन वृद्धि" हाइबरनेट इनबिल्ट वेतन वृद्धि है? क्या यह इनमे से किसके अधीन आता है, IDENTITY, AUTO, TABLE
अच्छा लग रहा है और प्रोग्रामिंग

तालिका में लगभग 700 मिलियन रिकॉर्ड कैसे हैं? यह बिना सूचकांक के मेरे विचार से मुद्दा हो सकता है
user2171669

10

FYI करें

एक mysql * auto_increment * कॉलम के साथ डेटाबेस से netbeans न्यू एंटिटी क्लासेस का उपयोग करना , आपको निम्नलिखित एनोटेशन के साथ एक विशेषता बनाता है:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;

यह मुझे एक ही त्रुटि कह रहा था कि कॉलम अशक्त नहीं होना चाहिए, इसलिए मैंने विशेषता विशेषता को छोड़कर @NotNull एनोटेशन को हटा दिया, और यह काम करता है!


7

हाइबरनेट पांच प्रकार की पहचानकर्ता पीढ़ी की रणनीतियों को परिभाषित करता है:

ऑटो - अंतर्निहित डीबी के आधार पर पहचान कॉलम, अनुक्रम या तालिका

टेबल - आईडी पकड़कर

पहचान - पहचान कॉलम

अनुक्रम - अनुक्रम

आइडेंटिटी कॉपी - आइडेंटिटी किसी दूसरी संस्था से कॉपी की जाती है

उदाहरण तालिका का उपयोग करते हुए

@Id
@GeneratedValue(strategy=GenerationType.TABLE , generator="employee_generator")
@TableGenerator(name="employee_generator", 
                table="pk_table", 
                pkColumnName="name", 
                valueColumnName="value",                            
                allocationSize=100) 
@Column(name="employee_id")
private Long employeeId;

अधिक जानकारी के लिए, लिंक की जाँच करें


4

यदि आपके पास एक संख्यात्मक स्तंभ है जिसे आप ऑटो-इंक्रीमेंट करना चाहते हैं, तो यह columnDefinitionसीधे सेट करने का विकल्प हो सकता है । इसका फायदा यह है, कि स्कीमा ऑटो का उपयोग करता है, भले ही यह हाइबरनेट के बिना इस्तेमाल किया गया हो। हालांकि यह आपके कोड को डीबी-विशिष्ट बना सकता है:

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql

MySQL है @ कॉलम (कॉलमडिफ़ाइनमेंट = "पूर्णांक
ऑटो_संकल्प

1

यदि पीके टाइप सीरियल है तो इन्फॉरमिक्स टेबल के लिए रणनीतियों की तलाश में इस एसओ प्रश्न में कोई भी "धक्कों" ।

मैंने पाया है कि यह काम करता है ... एक उदाहरण के रूप में।

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;

जब आप सत्र करते हैं, तो यह सुनिश्चित करने के लिए कि क्या आप काम करते हैं। SaveOrUpdate आप स्तंभ के लिए मान पास करते हैं special_serial_pk NULL

मेरे मामले में मैं JSON के साथ एक HTML POST करता हूँ जैसे ...

{
"special_serial_pk": null, //<-- Field to be incremented
"specialcolumn1": 1,
"specialcolumn2": "I love to code",
"specialcolumn3": true
}

0

एक mysql auto_increment कॉलम के साथ डेटाबेस से netbeans न्यू एंटिटी क्लासेस का उपयोग करना , आपको निम्न हाइबरनेट के साथ एक विशेषता बनाता है ।hm.xml : आईडी ऑटो वेतन वृद्धि है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.