2010-06-18 7 views
18

मैं अपनी इकाई पर आईडी उत्पन्न करने के लिए @GeneratedValue (strategy = GenerationType.AUTO) का उपयोग कर रहा हूं।ऑरैकल पर हाइबरनेट अनुक्रम, @ जेनरेटेड वैल्यू (रणनीति = जेनरेशन टाइप। ऑटो)

अब मैं यह कैसे काम करता हूं, लेकिन मेरे बच्चे की मेज पर, आईडी मान उत्पन्न करता है, जो मूल अनुक्रम का पालन करता है।

//parent table 
@Entity 
@Table (name = "parent") 
public class Parent { 

    @Id 
    @GeneratedValue (strategy = GenerationType.AUTO) 
    @Column (name = "id") 
    private long id; 


    @OneToMany (cascade = {CascadeType.ALL}, fetch = FetchType.LAZY) 
    @JoinColumn (name = "parentId") 
    @ForeignKey (name = "FKparent") 
    private List<child> child; 

} 

//child table 
@Entity 
@Table (name = "child") 
public class Child { 

    @Id 
    @GeneratedValue (strategy = GenerationType.AUTO) 
    @Column (name = "id") 
    private long id; 
} 

अभिभावक पर डाले गए आईडी मान, अनुक्रम अद्यतन करते हैं। बच्चे पर डाले गए आईडी मान, अनुक्रम अद्यतन करते हैं। माता-पिता के अगले सम्मिलन पर, अनुक्रम ... बाल सम्मिलन द्वारा अपडेट किए गए मानों का उपयोग करता है ...

यह एनोटेशन दो अनुक्रम नहीं बना रहे हैं, केवल एक। क्या यह सही/अपेक्षित है?

मैं अपने डीएओ सेवा केवल entityManager.persist(parent);

उत्तर

1

हाँ यह सही है और उम्मीद है का उपयोग कर के साथ मेरी संस्थाओं डाला।

आप प्रत्येक तालिका के लिए अलग-अलग अनुक्रम बना सकते हैं, लेकिन आईएमएचओ जो वास्तविक लाभ के साथ केवल अतिरिक्त कोड है।

+0

नहीं करता है, तो अंत उपयोगकर्ता देखता है कि कुंजी है और यह किया जा रहा द्वारा गुमराह कर रहा है " उछल "। और मुझे यह न बताएं कि कुंजी से उपयोगकर्ता को छिपाने की जरूरत है, जो हमेशा संभव नहीं है ... – Monoman

+1

आईड्स को समय और मोनोटोन में स्थिर रखने और अनुक्रम में छेद के बिना रखने का कोई तरीका नहीं है, जो कि मार नहीं जाता scalability। मैंने न तो 'अजीब' की उपयोगी परिभाषा देखी है और उपयोगकर्ताओं को अजीब आईडी क्यों चाहिए। –

44

ये एनोटेशन दो अनुक्रम नहीं बना रहे हैं, केवल एक। क्या यह सही/अपेक्षित है?

यह अपेक्षित व्यवहार है। @GeneratedValue(strategy = GenerationType.AUTO) का उपयोग करते समय, जेपीए प्रदाता विशेष डेटाबेस के लिए उपयुक्त रणनीति चुन लेगा। ओरेकल के मामले में, यह अनुक्रम होगा और, चूंकि आपने कुछ भी निर्दिष्ट नहीं किया है, इसलिए हाइबरनेट hibernate_sequence नामक एक वैश्विक अनुक्रम का उपयोग करेगा।

क्या यह सही है? खैर, मुझे नहीं पता, यह आपकी जरूरतों पर निर्भर करता है। बस मामले में, ओरेकल अनुक्रम के लिए डिफ़ॉल्ट अधिकतम मान 1 ई + 27, या 1,000,000,000,000,000,000,000,000,000 है। यह कई के लिए पर्याप्त है।

अब, यह GenerationType.AUTO का उपयोग करें और अभी भी अनुक्रम के नाम को नियंत्रित जब डेटाबेस दृश्यों का उपयोग करता है के लिए संभव है:

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

पास्कल, लेकिन यदि आप GenerationType.AUTO का उपयोग करना चाहते हैं तो MySQL जैसे अन्य डेटाबेस को पहचान सम्मिलित करने के लिए यह काम नहीं करेगा, है ना? क्योंकि आप जनरेटर मैन्युअल रूप से निर्दिष्ट करते हैं – lujop

0
@Entity 
@Table(name = "table_seq") 
@SequenceGenerator(name= "NAME_SEQUENCE", sequenceName = "SEQ_ID", initialValue=1, allocationSize = 1) 
public class SeqEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="NAME_SEQUENCE") 
private Long id; 

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