2010-03-05 6 views
7

मेरे पास कुछ कोड है:ओरेकल 10 जी बोली के साथ हाइबरनेट का उपयोग करके जेपीए के साथ मेरी आईडी कैसे उत्पन्न की जा रही है?

@Id 
@SequenceGenerator(name = "SOMETHING_SEQ") 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SOMETHING_SEQ") 
@Column(name = "SOMETHING", nullable = false) 
private Long id; 

हाइबरनेट कैसे मेरी आईडी प्रदान करता है?

मैं अपने डेटाबेस में एक एकल अनुक्रम 'hibernate_sequence' नामक और कोई अन्य हाइबरनेट 'विशेष टेबल' नहीं देखता हूं।

उत्तर

9
असल

, यहाँ SOMETHING_SEQ से लिया तुम कहीं कॉन्फ़िगर किया गया अनुक्रम का नाम है अपने हाइबरनेट कॉन्फ़िगरेशन में। और hibernate_sequence डेटाबेस में अनुक्रम नाम है। विन्यास में यह नीचे की तरह कुछ देख रहा होगा,

<sequence-generator name="SOMETHING_SEQ" 
    sequence-name="hibernate_sequence" 
    allocation-size="<any_number_value>"/> 

आप पूरी तरह बजाय एनोटेशन का उपयोग करके इस विन्यास छोड़ सकते हैं। फिर आपके @SequenceGenerator एनोटेशन को कुछ और पैरामीटर प्रदान करने की आवश्यकता होगी। नीचे उदाहरण है।

@SequenceGenerator(name="SOMETHING_SEQ", sequenceName="hibernate_sequence", allocationSize=10) 

उदाहरण एकाधिक इकाई वर्गों नीचे की तरह कुछ करना होगा के लिए,

@Entity 
public class Entity1 { 
    @Id 
    @SequenceGenerator(name = "entity1Seq", sequenceName="ENTITY1_SEQ", allocationSize=1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "entity1Seq") 
    @Column(name = "ID", nullable = false) 
    private Long id; 

    ... 
    ... 

} 

@Entity 
public class Entity2 { 
    @Id 
    @SequenceGenerator(name = "entity2Seq", sequenceName="ENTITY2_SEQ", allocationSize=10) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "entity2Seq") 
    @Column(name = "ID", nullable = false) 
    private Long id; 

    ... 
    ... 

} 
+0

धन्यवाद। लेकिन मेरे मामले में, हाइबरनेट कैसे मेरी आईडी प्रदान करता है? जब मैं अपनी लम्बी आईडी के लिए अपनी इकाई को शून्य मान के साथ सहेजता हूं, तो यह जादुई रूप से ऑटो डाला जाता है। क्या यह कुछ विशेष तालिका के माध्यम से है, या उस hibernate_sequence का उपयोग कर रहा है? या ..? – JavaRocky

+0

'हाइबरनेट-सीक्यू' का उपयोग करके, और निश्चित रूप से जब आपने इसे उत्पन्न करने के लिए हाइबरनेट कहा था, तो आपको स्वयं को कोई भी प्रदान नहीं करना चाहिए। या यहां तक ​​कि यदि आप प्रति मूल्य कुछ मूल्य प्रदान करते हैं, तो वह मान ओवरराइट हो जाएगा। –

+0

क्या आप कह रहे हैं कि कई इकाइयां समान हाइबरनेट अनुक्रम साझा करती हैं? – JavaRocky

0

ओरेकल में आपके पास auto_increment प्रकार नहीं है जैसा कि MySQL में है। तो, एक auto_increment कॉलम उत्पन्न करने के लिए आपको अनुक्रम का उपयोग करने की आवश्यकता है।

यह एक उदाहरण है कि आप इसे कैसे प्राप्त कर सकते हैं।

create table test (id number, testdata varchar2(255)); 


create sequence test_seq 
start with 1 
increment by 1 
nomaxvalue; 

create trigger test_trigger 
before insert on test 
for each row 
begin 
select test_seq.nextval into :new.id from dual; 
end; 

तो आप एक अनुक्रम बनाते हैं और प्रत्येक आईडी को अपनी आईडी जोड़ने के लिए एक ट्रिगर का उपयोग करते हैं।

तो कुछ इस तरह कर रही होगी हाइबरनेट, या के बजाय ट्रिगर कर

insert into test values(test_seq.nextval, 'no trigger needed!'); 

नोट का उपयोग कर: उदाहरण here

+0

धन्यवाद। वास्तव में ओरेकल में auto_increment क्षमता नहीं है। हालांकि, जब मैं अपना @ एंटिटी बचाता हूं तो मैं अपने @ आईडी फ़ील्ड को छोड़ देता हूं। जो तब EntityManager किसी भी तरह से कहीं से एक आईडी उत्पन्न करता है और इसे सम्मिलित करता है। मुझे यह पता है जब मैं कंसोल पर SQL आउटपुट सक्षम करता हूं। तो मेरे प्रश्न पर वापस आना, यह आईडी मेरी कॉन्फ़िगरेशन से कहां से आती है? – JavaRocky

+0

यह निश्चित रूप से अनुक्रम का उपयोग करता है। अब अगर यह ट्रिगर, या इनलाइन डालने का उपयोग करता है, तो एसक्यूएल दिखाने के लिए हाइबरनेट को कॉन्फ़िगर करें या जांचें कि ट्रिगर उत्पन्न हुआ था या नहीं, – Lombo

+0

हाइबरनेट ट्रिगर का उपयोग नहीं करता है, इसे केवल 'अगलीवाल' डालने पर मिलता है। –

4

आदेश अनुक्रम आप अपने @SequenceGenerator एनोटेशन में sequenceName सेट करने के लिए नाम के लिए में:

@GeneratedValue(name="gen", strategy = GeneratorType.SEQUENCE) 
@SequenceGenerator(name="gen", sequenceName="Sequence_Name", allocationSize = 1) 
@Id 
public Long getId() 
{ 
    // ... 
} 
के

ध्यान दें, यदि आप पूर्व-मौजूदा जनरेटर का उपयोग कर रहे हैं, तो आपके allocationSize को उस जनरेटर के आवंटन आकार से मेल खाना चाहिए।

4

हाइबरनेट कैसे मेरी आईडी प्रदान करता है?

ठीक है, आप स्पष्ट रूप से पहचानकर्ता स्वचालित रूप से (@GeneratedValue टिप्पणी के साथ) उत्पन्न करने के लिए प्रकार SEQUENCE की एक रणनीति का संकेत है कि एक डेटाबेस अनुक्रम पहचानकर्ता उत्पन्न करने के लिए इस्तेमाल किया जाना चाहिए का उपयोग कर जेपीए इंजन बताया। यदि आपको आश्चर्य है, तो अनुक्रम डेटाबेस विशिष्ट ऑब्जेक्ट्स (उदा। ओरेकल) हैं जिनका उपयोग अद्वितीय पूर्णांक उत्पन्न करने के लिए किया जा सकता है।

मैं वहाँ मेरी डेटाबेस एक 'hibernate_sequence' नाम दिया अनुक्रम में देख

तुम इतनी हाइबरनेट उपयोग करने के लिए डेटाबेस अनुक्रम ऑब्जेक्ट का नाम निर्दिष्ट करने के लिए अपने @SequenceGenerator में sequenceName एनोटेशन तत्व का उपयोग नहीं किया स्कीमा पीढ़ी के दौरान एक डिफ़ॉल्ट अनुक्रम ऑब्जेक्ट बनाया (जो hibernate_sequence पर डिफ़ॉल्ट है)। अनुक्रम निर्दिष्ट करने के लिए, इसे इस तरह करें:

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_entity_seq_gen") 
@SequenceGenerator(name = "my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ") 
private Long id; 
+0

समान रूप से अच्छा जवाब – JavaRocky

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