2010-11-18 90 views
6

我有一個複合id在我的類結構上定義如下。不幸的是我總是認爲在沒有找到「第2部分」抱怨休眠錯誤:複合鍵JPA/Hibernate與繼承類

「在實體MoreClass沒有發現@IdClass的屬性:第2部分」

任何人可以幫助我解決這個問題? (或至少指向我的一個有用的JPA /休眠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 2010-12-02 08:31:25

回答

2

其實撞到了same problem

由於:

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

似乎確實工作,我會認爲有一個bug。見https://hibernate.atlassian.net/browse/HHH-9114

+0

我不會稱之爲錯誤,請參閱下面的答案... – 2015-12-08 15:41:43

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這可能是錯誤所在。這可能是一個不同的錯誤,在Hibernate find with composite key. Invalid column name Exception

問正確的解決方法涉及手動添加@Column(name=),這與模式生成效果很好:

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

僅供參考,Spring Data JPA一起使用時,它需要MappedSuperclass中刪除@Id@Type註釋。如果這些不被刪除,將會有錯誤。它不會改變這個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

從JPA規範:

主鍵必須在作爲實體體系結構的上或 映射超根是一個(直接或間接)的實體類定義實體層次結構中所有實體類的超類。 主鍵必須定義恰好一次在實體層次結構中。

因此根據JPA,您不能重新定義@Id。我不會稱這是一個錯誤。

儘管作爲答案給出的解決方法可能適用,但對於其他JPA框架可能會發生這種情況,它不起作用。