2013-04-03 7 views
5

मैं कोड ऊपर उपयोग कर रहा हूँ आईडी उत्पन्न करने के लिए:@SequenceGenerator उत्पन्न डुप्लिकेट प्राथमिक कुंजी

@Id 
@GeneratedValue(generator = "seqq") 
@SequenceGenerator(name = "seqq", sequenceName = "seqq", allocationSize = 20, initialValue = 1) 
public long getId() { 
    return id; 
} 

मैं भी अद्यतन persistence.xml:

<property name="hibernate.id.new_generator_mappings" value="true"/> 

और डेटाबेस में अद्यतन DDL:

CREATE SEQUENCE seqq 
    INCREMENT 20 
    MINVALUE 1 
    MAXVALUE 9223372036854775807 
    START 9171 
    CACHE 1; 

इस आवंटन के लिए धन्यवाद आकार = 20 वृद्धि मूल्य के समान है। हालांकि, मुझे मनमानी त्रुटियां मिलती हैं जो कहती हैं कि डुप्लिकेट कुंजी मान अद्वितीय अवरोध "myobjects_pkey" का उल्लंघन करता है। अक्सर परीक्षण को बचाने के बाद यह त्रुटि होती है। ऐसा लगता है कि हाइबरनेट एक ही आईडी के साथ इकाई को बनाए रखने की कोशिश करता है। हालांकि स्टार्ट यह सुनिश्चित करता है कि पंक्ति तालिका आईडी में मौजूद किसी भी पंक्ति से अधिक है। डुप्लिकेट बाधा त्रुटि को कैसे निकालें?

उत्तर

0

कोशिश के रूप में नीचे रणनीति को निर्दिष्ट:

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "seqq") 

0

इस

/** The identity. */ 
    @Id 
    @Column(name = "id", unique = true, nullable = false) 
    @SequenceGenerator(name = "ID_SEQU_GENERATOR", sequenceName = "DB_SEQ") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ID_SEQU_GENERATOR") 
    public long getId() { 
     return id; 
    } 

DB_SEQ इस DB as sequence में परिभाषित किया जाना चाहिए की कोशिश करो।

0

hibernate.id.new_generator_mappings = true सेट करने के बाद, हाइबरनेट LASTPRODUCEDID-ALLOCATIONSIZE से शुरू होने वाले आईडी मानों का उत्पादन करेगा।

नया जनरेटर का उपयोग करने से पहले::

entity.id   SEQ last number 
    48847     48847 
    48848     48848 
    48849     48849 
    48850     48850 

नया जनरेटर का उपयोग करने के बाद:

entity.id   SEQ last number 
    48801     48851 
    48802     48852 

तो तुम आवंटन आकार के साथ अपने अनुक्रम में वृद्धि करने के लिए है मैं डिफ़ॉल्ट 50 allocationSize साथ निम्नलिखित का अनुभव किया। आपके अनुक्रम की धारा के अनुसार वृद्धि आवंटन आकार के बराबर होनी चाहिए, इसका मतलब है कि बस अपने अनुक्रमों के अगले भाग से पूछताछ करें। आप इसे निम्न स्क्रिप्ट के साथ कर सकते हैं:

DECLARE 
    v NUMBER; 
    BEGIN 
    FOR r IN (select sequence_name from user_sequences) LOOP 
     EXECUTE IMMEDIATE 'SELECT '|| r.sequence_name ||' .NEXTVAL FROM DUAL' INTO v; 
    END LOOP; 
    END; 
/
संबंधित मुद्दे