2010-11-18 8 views
6

के साथ जेपीए/हाइबरनेट में समग्र कुंजी मेरे पास मेरी कक्षा संरचना पर नीचे एक समग्र आईडी परिभाषित है। दुर्भाग्य से मैं हमेशा एक हाइबरनेट त्रुटि है कि नहीं मिला "part2" पर शिकायत मिलती है:विरासत वर्ग

"इकाई MoreClass में नहीं मिला @IdClass की संपत्ति: part2"

किसी को भी मुझे समस्या को ठीक करने में मदद कर सकते हैं? (या कम से कम एक उपयोगी जेपीए मुझे इंगित/doc हाइबरनेट?)

@IdClass(ClassKey.class) 
@Entity 
public class MoreClass extends LessClass implements Serializable 
{ 
    @Id 
    String part1; 
} 

@MappedSuperclass 
public class LessClass implements Serializable 
{ 
    @Id 
    String part2; 
} 

public class ClassKey implements Serializable 
{ 
    String part1; 
    String part2; 
} 
+0

जैसा कि मुझे कुछ विचार मिलते हैं, लेकिन कोई जवाब नहीं, मुझे यह मानना ​​चाहिए कि यह नक्षत्र संभव नहीं है। मुझे सिर्फ दस्तावेज़ों में संकेत नहीं मिल रहा है .... – austrianuser

उत्तर

2

असल same problem टकरा।

के रूप में:

@Override 
@Id 
public getPart2() { 
    return super.getPart2(); 
} 

काम करने के लिए लग रहे है, मैं इसे एक बग समझना होगा। https://hibernate.atlassian.net/browse/HHH-9114 देखें।

+0

मैं इसे एक बग नहीं कहूंगा, नीचे मेरा जवाब देखें ... –

2

उल्लेख किया गया माइकल द्वारा HHH-9114 bug के लिए वर्कअराउंड, उदाहरण के लिए TwitterListedCount को जोड़कर मेरे मामले में:, (ध्यान दें कि दोनों @Idऔर@Type अभी भी काम करने के लिए उपयोगकर्ता प्रकार के लिए जोड़ा जाना चाहिए) जब स्कीमा पीढ़ी के साथ प्रयोग किया

// TODO: https://hibernate.atlassian.net/browse/HHH-9114 
@Override @Id 
public long getTwitterUserId() { 
    return super.getTwitterUserId(); 
} 

@Override @Id 
public DateTime getFetchTime() { 
    return super.getFetchTime(); 
} 

Btw, वैकल्पिक हल एक nasty side-effect HHH-9350 है यह उत्पन्न समग्र कॉलम नकल:

CREATE TABLE buzz.twitterlistedcount 
(
    id_fetchtime timestamp without time zone NOT NULL, 
    id_twitteruserid bigint NOT NULL, 
    _identifiermapper_fetchtime timestamp without time zone NOT NULL, 
    _identifiermapper_twitteruserid bigint NOT NULL, 
    listedcount integer NOT NULL, 
    CONSTRAINT twitterlistedcount_pkey PRIMARY KEY (id_fetchtime, id_twitteruserid) 
) 
WITH (
    OIDS=FALSE 
); 

मैं @MappedSuperclass का उपयोग नहीं करने की कोशिश की, लेकिन गलत स्कीमा पीढ़ी अभी भी होता है। बीटीडब्ल्यू मैं DefaultComponentSafeNamingStrategy का उपयोग कर रहा हूं, जहां बग झूठ बोल सकता है।

@Id 
@Basic() 
@Column(name="twitteruserid") 
private long twitterUserId = 0; 

@Id 
@Basic() 
@Column(name="fetchtime") 
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") 
private DateTime fetchTime = null; 

FYI करें, जब Spring Data JPA के साथ उपयोग किया है, यह करने के लिए आवश्यक है: यह शायद एक अलग बग, Hibernate find with composite key. Invalid column name Exception

में पूछा उचित समाधान का मैन्युअल @Column(name=) जोड़ दिया जाता है, जो स्कीमा पीढ़ी के साथ अच्छी तरह से काम करता है @Id और @TypeMappedSuperclass से एनोटेशन हटाएं। अगर इन्हें हटाया नहीं जाता है, तो त्रुटियों में कमी आएगी। यह इस हाइबरनेट बग, बीटीडब्ल्यू की प्रकृति को नहीं बदलता है।

org.springframework.data.mapping.model.MappingException: Ambiguous mapping! Annotation Id configured on field twitterUserId and one of its accessor methods in class TwitterFollowerCount! 
    at org.springframework.data.mapping.model.AnnotationBasedPersistentProperty.populateAnnotationCache(AnnotationBasedPersistentProperty.java:111) 
    at org.springframework.data.mapping.model.AnnotationBasedPersistentProperty.<init>(AnnotationBasedPersistentProperty.java:66) 
    at org.springframework.data.jpa.mapping.JpaPersistentPropertyImpl.<init>(JpaPersistentPropertyImpl.java:86) 
    at org.springframework.data.jpa.mapping.JpaMetamodelMappingContext.createPersistentProperty(JpaMetamodelMappingContext.java:67) 
    at org.springframework.data.jpa.mapping.JpaMetamodelMappingContext.createPersistentProperty(JpaMetamodelMappingContext.java:35) 
    at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.createAndRegisterProperty(AbstractMappingContext.java:449) 
    at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.doWith(AbstractMappingContext.java:427) 
    at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:607) 
    at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:295) 
    at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:257) 
    at org.springframework.data.mapping.context.AbstractMappingContext.initialize(AbstractMappingContext.java:373) 
    at org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension$JpaMetamodelMappingContextFactoryBean.createInstance(JpaRepositoryConfigExtension.java:216) 
    at org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension$JpaMetamodelMappingContextFactoryBean.createInstance(JpaRepositoryConfigExtension.java:169) 
    at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:134) 
    at org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension$JpaMetamodelMappingContextFactoryBean.afterPropertiesSet(JpaRepositoryConfigExtension.java:230) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549) 
    ... 40 more 
1

जेपीए कल्पना से:

प्राथमिक कुंजी इकाई वर्ग इकाई पदानुक्रम के या एक मैप की सुपर क्लास पर रूट वह यह है कि एक (प्रत्यक्ष या अप्रत्यक्ष) है कि पर परिभाषित किया जाना चाहिए इकाई पदानुक्रम में सभी इकाई वर्गों के superclass। प्राथमिक कुंजी को एक इकाई पदानुक्रम में ठीक उसी बार परिभाषित किया जाना चाहिए।

तो जेपीए के अनुसार आप @Id को फिर से परिभाषित नहीं कर सकते हैं। मैं इसे एक बग नहीं कहूंगा।

हालांकि यहां उत्तर के रूप में दिए गए कामकाज का काम हो सकता है, ऐसा हो सकता है कि अन्य जेपीए ढांचे के लिए यह काम नहीं करता है।