2010-11-18 11 views
6

私は以下のように私のクラス構造上に定義された複合idを持っています。残念ながら私はいつもは見られない「その2」に文句を言う休止状態のエラーを取得:継承されたクラスを持つJPA/Hibernateの複合キー

「実体MoreClassでは見られない@IdClassの特性:その2」

は、誰もが、問題の修正に私を助けることができますか? (あるいは、少なくともドキュメントを休止/便利JPAに私を指す?)実際にsame problemにぶつかった

@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

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

が動作するようには思えない、私はそれをバグを考えるでしょう。 https://hibernate.atlassian.net/browse/HHH-9114を参照してください。

+0

私はこれをバグと呼んでいない、私の答えを見てください... –

2

HHH-9114 bugについては、の回避策は、マイケルの作品である。 (両方@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(); 
} 

スキーマ生成で使用する場合ところで、回避策はnasty side-effect HHH-9350を持っている、それは:TwitterListedCountに追加することによって、私の場合複合列を複製生成:

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を使用しないしようとしましたが、間違ったスキーマ生成はまだ起こります。 BTW私はDefaultComponentSafeNamingStrategyを使用しています。これはバグがある場所です。これは、適切な回避策Hibernate find with composite key. Invalid column name Exception

に尋ねた、おそらく別のバグであるスキーマ生成とよく働く、手動@Column(name=)を加えることを含む:

FYI
@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と一緒に使用する場合、それはに必須です@Id@Typeアノテーションを削除します(MappedSuperclass)。これらが削除されないと、エラーが発生します。 は、このHibernateバグ、BTWの性質を変更しません。

JPA仕様から
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

:主キーは、エンティティ階層のまたは(直接的または間接的)である マッピングされたスーパークラスのルートであるエンティティ・クラスで定義しなければならない

エンティティ階層内のすべてのエンティティクラスのスーパークラス。 プライマリキーは、エンティティ階層内のの1回だけ、正確にと定義する必要があります。

したがって、JPAによれば、@Idを再定義することはできません。私はこれをバグと呼んでいません。

ここで答えとして示された回避策が機能するかもしれませんが、他のJPAフレームワークでは機能しない可能性があります。

関連する問題