2010-12-30 11 views
15

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

हमारे आवेदन के सभी संस्थाओं का विस्तार एक सुपर क्लास DataObject इस तरह कहा जाता है:

@MappedSuperclass 
public abstract class DataObject implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    @Column(name = "id") 
    private int id; 
} 

@Entity 
@Table(name = "entity_a") 
public class EntityA extends DataObject { ... } 

@Entity 
@Table(name = "entity_b") 
public class EntityB extends DataObject { ... } 

यह एक साझा अनुक्रम, डिफ़ॉल्ट hibernate_sequence उपयोग करने के लिए सभी संस्थाओं का कारण बनता है।

मैं जो करना चाहता हूं वह प्रत्येक इकाई के लिए एक अलग अनुक्रम का उपयोग करता है, उदाहरण के लिए उपरोक्त उदाहरण में entity_a_sequence और entity_b_sequence। यदि आईडी उपclasses पर निर्दिष्ट किया गया था तो मैं प्रत्येक इकाई के लिए अनुक्रम निर्दिष्ट करने के लिए @SequenceGenerator एनोटेशन का उपयोग कर सकता था, लेकिन इस मामले में आईडी superclass पर है। यह देखते हुए कि आईडी superclass में है, क्या एक तरीका है कि मैं प्रत्येक इकाई के लिए एक अलग अनुक्रम का उपयोग कर सकता हूं - और यदि हां, तो कैसे?

(हम PostgreSQL 8.3 का उपयोग कर रहे हैं, ऐसा होता है कि प्रासंगिक है में)

उत्तर

25

आप इसे इस तरह से कर रही है प्रयास किया है?

@MappedSuperclass 
public abstract class DataObject implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idgen") 
    @Column(name = "id") 
    private int id; 
} 

@Entity 
@SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "entityaseq") 
@Table(name = "entity_a") 
public class EntityA extends DataObject { 

} 

@Entity 
@SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "entitybseq") 
@Table(name = "entity_b") 
public class EntityB extends DataObject { 

} 

मुझे खेद है कि मेरे पास अभी परीक्षण करने के लिए आवश्यक वातावरण नहीं है लेकिन मैं इसे बाद में कोशिश करूंगा।

+1

हाँ - यह काम करता है! मैंने कुछ ऐसा करने की कोशिश की थी लेकिन 'org.hibernate.AnnotationException: अज्ञात Id.generator: idgen' प्राप्त करना जारी रखा। हालांकि आपका कोड ठीक काम करता है; यह पता चला है कि मैं अपने पहले प्रयास में उपखंडों में से एक पर '@ अनुक्रम जेनरेटर' शामिल करना भूल गया था। तो जवाब यह है कि यह काम करता है, जब तक कि प्रत्येक इकाई उपclass पर @SequenceGenerator एनोटेशन है। – gutch

1

टेबल पीढ़ी stretergy हर तालिका के लिए अलग db अनुक्रम का उपयोग करता है, लेकिन यह थोड़ा महंगा आपरेशन

0

IHMO वहाँ यह करने के लिए बेहतर तरीका है:

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

यह मेरे एप्लिकेशन में काम करता है।

+1

आईडी बनाने के लिए डेटाबेस की मूल विधि का उपयोग करता है (उदा। MySQL में auto_increment) और थोक आवेषण के लिए बहुत अक्षम है क्योंकि डेटाबेस ड्राइवर से उत्पन्न आईडी प्राप्त करने के लिए आवेषण को एक-एक करके किया जाना चाहिए। – Frans

3

हम अपने जेपीए संस्थाओं के सभी का सार सुपर क्लास में इस का उपयोग करें:

@Id 
@GeneratedValue(generator = "pooled") 
@GenericGenerator(name = "pooled", strategy = "org.hibernate.id.enhanced.TableGenerator", parameters = { 
     @org.hibernate.annotations.Parameter(name = "value_column_name", value = "sequence_next_hi_value"), 
     @org.hibernate.annotations.Parameter(name = "prefer_entity_table_as_segment_value", value = "true"), 
     @org.hibernate.annotations.Parameter(name = "optimizer", value = "pooled-lo"), 
     @org.hibernate.annotations.Parameter(name = "increment_size", value = "100")}) 
private Long id; 

यह थोड़ा वर्बोज़ है, लेकिन यह prefer_entity_table_as_segment_value आप id क्षेत्र या दोहराने की जरूरत नहीं है जिसका मतलब है कि स्थापित करने की अनुमति देता है उपclasses में जनरेटर एनोटेशन।