2009-05-27 10 views
75

com.something.SuperClass के साथ पहचान स्तंभ कुंजी पीढ़ी का उपयोग नहीं कर सकता:<संघ-उपवर्ग> (TABLE_PER_CLASS)

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class SuperClass implements Serializable { 
    private static final long serialVersionUID = -695503064509648117L; 

    long confirmationCode; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) // Causes exception!!! 
    public long getConfirmationCode() { 
     return confirmationCode; 
    } 

    public void setConfirmationCode(long confirmationCode) { 
     this.confirmationCode = confirmationCode; 
    } 
} 

com.something.SubClass:

@Entity 
public abstract class Subclass extends SuperClass { 
    private static final long serialVersionUID = 8623159397061057722L; 

    String name; 

    @Column(nullable = false) 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

देता है मुझे यह अपवाद:

Caused by: org.hibernate.MappingException: Cannot use identity column key 
generation with <union-subclass> mapping for: com.something.SuperClass 

आईडी उत्पन्न करने के लिए मेरे लिए सबसे अच्छा और सबसे सुविधाजनक तरीका क्या है? मैं अपनी विरासत रणनीति को बदलना नहीं चाहता हूं।

उत्तर

190

समस्या यह है कि आप "टेबल-प्रति-वर्ग" विरासत और GenerationType.Auto मिश्रण करते हैं। एमएसएसक्यूएल में एक पहचान कॉलम पर विचार करें। यह कॉलम आधारित है। एक "टेबल-प्रति-वर्ग" रणनीति में आप प्रति वर्ग एक टेबल का उपयोग करते हैं और प्रत्येक के पास एक आईडी होती है।

प्रयास करें:

@GeneratedValue(strategy = GenerationType.TABLE)

+1

परफेक्ट समाधान के लिए @ मैप्डसुपरक्लास का उपयोग कर सकते हैं। यहां तक ​​कि हाइबरनेट मंचों didnot इस समाधान है लगता है, और वे विषय https://forum.hibernate.org/viewtopic.php?p=2319244&sid=4493aa54d27d3f81a0e27ecbdda075ae –

+1

चारों ओर जा रहे थे इस मुद्दे MySql केवल या अपने नियमित के साथ है जैसा कि मैं टेबल प्रति वर्ग दृष्टिकोण के लिए एक वीडियो देखता हूं और यह पोस्टग्रेस में ठीक काम कर रहा था – Prashant

+1

का उपयोग किया गया था, मैंने हाल ही में ड्रॉपविज़ार्ड एप्लिकेशन का परीक्षण करते समय इसमें भाग लिया था। मेरे मामले में मैंने सत्र फैक्ट्री बनाने के लिए डीडब्ल्यू द्वारा उपयोग किए गए समान कॉन्फ़िगरेशन विकल्पों का उपयोग करके यह सुनिश्चित किया। मुझे यकीन है कि संपत्ति को "hibernate.id.new_generator_mappings" को सही पर सेट करना निश्चित है। यह डीडब्ल्यू 0.7.0 है, हाइबरनेट 4.3.1, डीबी एच 2 था। – sfitts

6

मुझे आश्चर्य है कि अगर यह एक डेटाबेस बोली विशिष्ट समस्या है, मैंने देखा कि अंतर्निहित डेटाबेस के रूप में PostgreSQL के साथ एक यूट्यूब ट्यूटोरियल देखकर के बाद से है कि वीडियो रन के साथ succefully किसी ऐप के निर्माता डिफ़ॉल्ट @ जेनरेटेड वैल्यू। मेरे मामले में (अंतर्निहित डेटाबेस MySQL है) मुझे जेनरेशन वैल्यू रणनीति को जनरेशन टाइप करने के लिए संशोधित करना था। बिल्कुल Zoidbeck प्रस्तावों के रूप में। https://www.youtube.com/watch?v=qIdM4KQOtH8

+0

पोस्टग्रेस विरासत करने में सक्षम है ताकि आप सही हो सकें कि यह डेटाबेस विशिष्ट है: http://www.postgresql.org/docs/8.1 /static/ddl-inherit.html वीडियो व्याख्या नहीं करता है (या मुझे याद आया) स्कीमा कैसे उत्पन्न होता है। तो हो सकता है कि एनएचबीर्नेट पोस्टग्रेज़ बोलीभाषा इसे स्वयं करने में सक्षम हो या इसके बजाय आपको मैन्युअल रूप से 'INHERITS' जोड़ना होगा। असल में मैं नहीं बता सकता। – zoidbeck

+5

PostgreSQL पर, हाइबरनेट डिफ़ॉल्ट रूप से 'जेनरेशन टाइप टाइप करें।' का उपयोग करने के लिए डिफ़ॉल्ट है। यही कारण है कि यह स्वचालित रूप से वहां काम करता है। PostgreSQLs 'INHERITS' के साथ यह बिल्कुल _nothing_ नहीं है। – Henning

+0

मैं एक ही ट्यूटोरियल का उपयोग कर रहा हूं और @ जेनरेटेड का उपयोग कर समस्या उत्पन्न कर रहा था क्योंकि मैं MySQL का उपयोग कर रहा हूं। जब तक मैंने यह पोस्ट –

2

हमारे मामले में, हम एक PostreSQL डेटाबेस देव और उत्पादन और परीक्षण के लिए एक में स्मृति HSQLDB डेटाबेस के लिए उपयोग करें:

यहाँ वीडियो है। हम एक आईडी उत्पन्न करने के लिए दोनों मामलों में एक अनुक्रम का उपयोग कर रहे हैं। जाहिर है GenerationType.AUTO पोस्टग्रेज़ के लिए SEQUENCE पर डिफ़ॉल्ट है, लेकिन हमारे स्थानीय परीक्षणों में विफल रहा है (hsqldb के लिए कुछ और डिफ़ॉल्ट होना चाहिए)।

तो हमारे लिए काम करने वाला समाधान स्पष्ट रूप से GenerationType.SEQUENCE का उपयोग करें।

-1

MySQL और PostgreSQL के बीच एक SQL मानक अनुपालन है। पोस्टग्रेएसक्यूएल पोस्टग्रेस एसक्यूएल 9 2/99 के साथ-साथ इन सबसेट्स में कुछ ऑब्जेक्ट-ओरिएंटेड फीचर्स का एक अच्छा सबसेट समझता है। Postgres जटिल दिनचर्या और नियमों को घोषणात्मक एसक्यूएल प्रश्न, subqueries, विचार, बहु उपयोगकर्ता समर्थन, लेनदेन, क्वेरी अनुकूलन, विरासत, और सरणी के रूप में संभालने में सक्षम है। विभिन्न डेटाबेस में डेटा का चयन करने का समर्थन नहीं करता है।

MySQL MySQL इसकी नींव के रूप में SQL92 का उपयोग करता है। अनगिनत प्लेटफार्मों पर चलता है। MySQL उन प्रश्नों का निर्माण कर सकता है जो विभिन्न डेटाबेस से तालिकाओं में शामिल हो सकते हैं। एएनएसआई और ओडीबीसी सिंटैक्स दोनों का उपयोग करके बाएं और दाएं बाहरी जुड़ने दोनों का समर्थन करता है। MySQL 4.1 के रूप में उस रिलीज से, MySQL subqueries को संभालेगा। रिलीज के रूप में समर्थित दृश्य 5.

विस्तृत विवरण के लिए कृपया देखें। http://www-css.fnal.gov/dsg/external/freeware/pgsql-vs-mysql.html

+0

नहीं देखा, तब तक मुझे बहुत समय लगता है, लेकिन कृपया मुझे लगता है कि MySQL और PostgreSQL तुलना विषय के लिए अप्रासंगिक है (भले ही हाइबरनेट डिफ़ॉल्ट उनके लिए अलग हैं)। – mrts

2

ज़ॉइडबेक के उत्तर से सहमत हैं। आप के लिए रणनीति बदलने की जरूरत है: आप एक नया टेबल बनाने की जरूरत

@GeneratedValue(strategy = GenerationType.TABLE) 

लेकिन वह सब नहीं है, क्या अपने सार की तालिका प्राथमिक कुंजी अनुक्रम का आयोजन करेगा।

@Id 
@GeneratedValue(strategy = GenerationType.TABLE, generator = "ConfirmationCodeGenerator") 
@TableGenerator(table = "SEQUENCES", name = "ConfirmationCodeGenerator") 
public long getConfirmationCode() { 
    return confirmationCode; 
} 

करने के लिए अपने मानचित्रण को संशोधित करने और डेटाबेस में एक नई तालिका ऐसा दिखाई देगा: enter image description here

जब आप अपने आवेदन भाग गया, हाइबरनेट इस में एक पंक्ति जहां sequence_name इकाई नाम होगा (SuperClass से जोड़ दिया जाएगा उदाहरण) और sequence_next_hi_value मान स्वचालित रूप से बढ़ेगा और सभी कार्यान्वयन उप-वर्गों के तालिकाओं के नए रिकॉर्ड के लिए उपयोग किया जाएगा।

0

आप विरासत

+0

क्या आप अपने उत्तर के लिए उदाहरण कोड जोड़ सकते हैं? –

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