2010-04-29 10 views
6

के बीच साझा किया मैं एक @Id के साथ एक 'कुत्ता' Entitiy और एक @TableGeneratorजेपीए @TableGenerator, विभिन्न इकाइयों

... 
@TableGenerator(table = "seq", name = "dog_gen", pkColumnName = "seq_name", valueColumnName="seq_val") 
@Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "dog_gen") 
private Long id; 
... 

वहाँ अन्य संस्था में एक ही तालिका जनरेटर (dog_gen) का पुन: उपयोग करने के लिए एक रास्ता है है? मैं दो स्वतंत्र संस्थाओं में एक ही आईडी अनुक्रम रखना चाहते हैं, कहते हैं कि

कुत्ते = 1, कुत्ते = 2, कुत्ते = 3, बिल्ली = 4, बिल्ली = 5, कुत्ते = 6 और इतने पर ...

दोनों संस्थाएं आईडी संपत्ति के साथ किसी प्रकार की विरासत को लागू करने के लिए एक सामान्य सुपरक्लास साझा नहीं करती हैं।

अगर मैं अपने बिल्ली इकाई पर @GeneratedValue (जनरेटर = "dog_gen") जोड़ने के लिए, @TableGenerator घोषणा को छोड़ते हुए एक अपवाद कह जब संदर्भ शुरू कर यह जनरेटर नहीं मिल सकता है फेंकता है।

Caused by: org.hibernate.AnnotationException: Unknown Id.generator: dog_gen 
at org.hibernate.cfg.BinderHelper.makeIdGenerator(BinderHelper.java:413) 
at org.hibernate.cfg.AnnotationBinder.bindId(AnnotationBinder.java:1795) 
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1229) 
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:733) 
at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:498) 
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:277) 

उत्तर

3
दरअसल

और यह नहीं है कि मैं क्या @TableGenerator की जावाडोक पढ़ने के बाद उम्मीद कर रहा था:

यह टिप्पणी एक प्राथमिक कुंजी जनरेटर कि नाम से संदर्भित किया जा सकता है जब एक जनरेटर तत्व के लिए निर्दिष्ट किया जाता है परिभाषित करता है GeneratedValue एनोटेशन। एक इकाई जनरेटर इकाई वर्ग या प्राथमिक कुंजी फ़ील्ड या संपत्ति पर निर्दिष्ट किया जा सकता है। जनरेटर नाम का दायरा दृढ़ता इकाई (सभी जेनरेटर प्रकारों में) के लिए वैश्विक है।

हो सकता है कि मैं चीजों को सही ढंग से व्याख्या कर रहा हूँ नहीं (जेपीए कल्पना की धारा 9.1.38 हमें और अधिक बता नहीं करता है), लेकिन मैं @GeneratedValue में एक और इकाई से एक जनरेटर नाम संदर्भित करने के लिए सक्षम होने के लिए उम्मीद कर रहा था।

वैसे भी, निम्नलिखित काम करने लगता है।

@TableGenerator(table = "myseq", name = "dog_gen", pkColumnName = "seq_name", 
     valueColumnName = "seq_val", pkColumnValue = "Dog", allocationSize = 1) 
@Id 
@GeneratedValue(strategy = GenerationType.TABLE, generator = "dog_gen") 
private Long id; 

और Cat में, ठीक है, एक ही: Dog इकाई में

@TableGenerator(table = "myseq", name = "dog_gen", pkColumnName = "seq_name", 
     valueColumnName = "seq_val", pkColumnValue = "Dog", allocationSize = 1) 
@Id 
@GeneratedValue(strategy = GenerationType.TABLE, generator = "dog_gen") 
private Long id; 
+2

मैं इसे करने की कोशिश की ... यह केवल काम करने के लिए लगता है, क्योंकि आवंटन आकार 1. है लेकिन असल में अलग जनरेटर उत्तर कार्य अलग से बनाया गया है। यदि आप 1 से अधिक आवंटन आकार चुनते हैं, तो आप देखेंगे कि आपके पास प्रत्येक इकाई के लिए अलग-अलग आईडी श्रेणियां होंगी। (यहां हाइबरनेट 3.6 का उपयोग करके, शायद यह 4.x के साथ बेहतर काम करता है?) –

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