2010-11-18 12 views
6

Ich habe eine zusammengesetzte ID definiert in meiner Klassenstruktur wie folgt. Leider bekomme ich immer einen Hibernate-Fehler, der auf dem nicht gefunden „Teil2“, klagt:Zusammengesetzte Schlüssel in JPA/Hibernate mit geerbter Klasse

„Eigentum von @IdClass nicht in Einheit MoreClass gefunden: Teil2“

Kann jemand mir helfen, das Problem auf Festsetzung? (Oder zumindest zeigen Sie mir auf eine hilfreiche JPA/Hibernate 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

Da ich einige Ansichten bekomme, aber keine Antwort, sollte ich annehmen, dass diese Konstellation nicht möglich ist. Ich kann einfach keinen Hinweis in der Dokumentation finden .... – austrianuser

Antwort

2

tatsächlich in die same problem gestoßen.

As:

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

Scheinen, zu arbeiten ich es für einen Fehler halten würde. Siehe https://hibernate.atlassian.net/browse/HHH-9114.

+0

Ich würde das nicht einen Fehler nennen, siehe meine Antwort unten ... –

2

Die erwähnte Problemumgehung für HHH-9114 bug von Michael arbeitet, z.B. in meinem Fall, indem zu TwitterListedCount: (beachten Sie, dass beide @Idund@Type müssen für Benutzertypen hinzugefügt werden, um noch arbeiten)

// 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, hat die Abhilfe nasty side-effect HHH-9350 ein, wenn sie mit Schema Generation verwendet, es erzeugen Verbundstützen duplizieren:

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 
); 

ich versuchte, nicht @MappedSuperclass zu verwenden überhaupt, aber die falsche Schema Generation immer noch geschieht. BTW Ich verwende DefaultComponentSafeNamingStrategy, wo der Fehler liegen kann. Dies ist wahrscheinlich ein anderer Fehler, fragte in Hibernate find with composite key. Invalid column name Exception

Die richtige Abhilfe manuell @Column(name=) Hinzufügen beinhaltet, die gut mit Schema Generation arbeitet:

@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, , wenn sie mit Spring Data JPA, zusammen verwendet werden, es zu erforderlich ist Entfernen Sie die @Id und @Type Annotationen aus dem MappedSuperclass. Wenn diese nicht entfernt werden, wird es unten zu Fehlern kommen. Es ändert nicht die Art dieses Hibernate Bug, BTW.

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

Aus der JPA spec:

Der Primärschlüssel auf der Objektklasse definiert werden muss, dass die Wurzel der Entität Hierarchie oder auf einer übergeordneten Klasse abgebildet, die einen (direkten oder indirekten) ist Oberklasse aller Entitätsklassen in der Entitätshierarchie. Der Primärschlüssel muss genau einmal in einer Entitätshierarchie definiert werden.

So nach JPA können Sie die @Id nicht neu definieren. Ich würde das nicht als Fehler bezeichnen.

Obwohl die hier beschriebene Problemumgehung funktioniert, kann es vorkommen, dass sie für andere JPA-Frameworks nicht funktioniert.

Verwandte Themen