2009-06-04 12 views
10

में एक दूसरे @Embeddable फ़ील्ड मैपिंग हाइबरनेट मैक एक उप-वर्ग में एक @Embeddable ऑब्जेक्ट को मैप करने की कोशिश कर रहा हूं जिसका मूल वर्ग पहले से ही उस @Embeddable प्रकार का क्षेत्र है।एक सबक्लास

हाइबरनेट Embeddable Objects documentation दावों मैं एक @Embeddable वस्तु के स्तंभ नाम ओवरराइड करने के लिए @AttributeOverrides उपयोग कर सकते हैं:

उदा

@Embeddable 
    public class ContentID implements Serializable { 
     @Column(name="contentID") 
     private String contentPath; 
    } 

    @MappedSuperclass 
    public abstract class BaseDomainObject implements Serializable { 

     @Embedded 
     private ContentID contentID; 
    } 

public class Achievement extends BaseDomainObject { 

    @Embedded 
    @AttributeOverrides({ 
     @AttributeOverride(name="contentID", column = @Column(name="awardedItem")), 
    }) 
    private ContentID awardedItem; 
} 

त्रुटि मैं मिलता है:

@Entity 
public class Person implements Serializable { 

    // Persistent component using defaults 
    Address homeAddress; 

    @Embedded 
    @AttributeOverrides({ 
      @AttributeOverride(name="iso2", column = @Column(name="bornIso2")), 
      @AttributeOverride(name="name", column = @Column(name="bornCountryName")) 
    }) 
    Country bornIn; 
    ... 
} 

यहाँ मामला मेरे पास है

org.hibernate.MappingException: अचीवमेंट स्तंभ: इकाई के लिए मानचित्रण में दोहराया स्तंभ: contentID ( org.hibernate.mapping.PersistentC पर सम्मिलित = "झूठी" अद्यतन = "झूठी") के साथ मैप किया जाना चाहिए lass.checkColumnDuplication (PersistentClass.java:652) org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication (PersistentClass.java:674) पर org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication (PersistentClass.java:670) पर पर org.hibernate.mapping.PersistentClass.checkColumnDuplication (PersistentClass.java:696) org.hibernate.mapping.PersistentClass.validate (PersistentClass.java:450) पर org.hibernate.mapping.SingleTableSubclass.validate पर (SingleTableSubclass .java: 43) org.hibernate.cfg.Configuration.validate (Configuration.java:1108) परorg.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:1293) org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory (AnnotationConfiguration.java:867) पर

अद्यतन:

मैंने इस से संबंधित हाइबरनेट मुद्दों के लिए देखा और ग्रैलीज प्रोजेक्ट ने दावा किया कि उन्होंने इस मुद्दे को ठीक किया है, लेकिन उनका एनोटेशन समाधान मान्य जैवैक्स नहीं है। प्रेरणा एनोटेशन (शायद यह एक नया संस्करण है)।

JPA @Embeddable/@Embedded throws org.hibernate.MappingException: Repeated column in mapping for entity

+0

देखें जिज्ञासा से बाहर: क्यों आप देश के बजाय एम्बेड करूं एक रिश्ते का उपयोग करने का? –

उत्तर

7

समस्या यह प्रतीत हो रहा है:

public class ContentID implements Serializable { 
    @Column(name="contentID") 
    private String contentPath; 
} 

आप contentPath स्तंभ नाम कर रहे हैं "कन्टैंट" होने के लिए और है कि अपने AttributeOverride टिप्पणी के साथ बाद में टकरा जाता है। मैं भी इस बारे में सोच रहा हूँ

public class ContentID implements Serializable { 
    @Column(name="contentPath") 
    private String contentPath; 
} 

अद्यतन:

इस प्रयास करें

@Embedded 
@AttributeOverrides({ 
    @AttributeOverride(name="contentID", column = @Column(name="awardedItem")), 
}) 
private ContentID awardedItem; 

आप awardedItem करने के लिए यहाँ ContentID स्तंभ का नाम बदलने लगते हैं। क्या यह सचमुच आवश्यक है?

+0

यह समस्या उपलब्धि में @AttributeOverride के कारण नहीं है, लेकिन @Embedded ContentID की वजह से उपलब्धि के बेस क्लास बेसडोमेन ऑब्जेक्ट में है। समस्या हाइबरनेट मैपिंग में है, विरासत ऑब्जेक्ट को 2 एंबेडेड कंटेंट आईडी ऑब्जेक्ट्स को contentID कॉलम के रूप में लेती है, जिसे मैंने सोचा था कि एट्रिब्यूटऑवर्राइड इसका ख्याल रखेगा। भले ही मैंने @ कॉलम (name = "contentID" हटा दिया) मुझे लगता है कि समस्या बनी रहेगी। – Dougnukem

1

मैं

@JoinColumn(insertable=false, updatable=false) 

उपयोग कर रहा हूँ एक समाधान के रूप।

2

विन्सेंट सही है। attributeOverride नाम फ़ील्ड कॉलम नाम का जिक्र कर रहा है जब यह किसी वर्ग की विशेषता/संपत्ति होनी चाहिए।

@AttributeOverrides({ 
    @AttributeOverride(name="contentPath", column = @Column(name="awardedItem")), 
}) 

ध्यान दें कि नाम वर्ग संपत्ति के लिए डेटाबेस कॉलम नहीं है।

documentation

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