6

以下のように、クラス構造で定義された複合 ID があります。残念ながら、見つからない「part2」について不平を言う休止状態エラーが常に発生します。

「@IdClass のプロパティがエンティティ MoreClass に見つかりません: part2」

誰でも問題を解決するのを手伝ってくれますか? (または、少なくとも役立つ 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;
}
4

3 に答える 3

3

Michael によるHHH-9114 バグの上記の回避策は、たとえば、私の場合は : に追加することで機能します (ユーザー タイプを引き続き機能させるには、 と の両方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();
}

ところで、回避策には厄介な副作用があります 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 で尋ねられます。無効な列名の例外

適切な回避策には、手動で追加することが含ま@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と一緒に使用する場合、およびアノテーションを から削除する@Id@TypeMappedSuperclass必要があります。これらを削除しないと、以下のエラーが発生します。ところで、このHibernate バグの性質は変わりません。

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
于 2014-08-19T07:24:36.950 に答える
2

実際にぶつかったsame problem

として:

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

動作しているようですが、バグだと思います。https://hibernate.atlassian.net/browse/HHH-9114を参照してください。

于 2010-12-23T11:32:06.647 に答える
2

JPA仕様から:

主キーは、エンティティ階層のルートであるエンティティ クラス、またはエンティティ階層内のすべてのエンティティ クラスの (直接的または間接的な) スーパークラスであるマップされたスーパークラスで定義する必要があります。主キーは、エンティティ階層で1 回だけ定義する必要があります。

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

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

于 2015-12-08T15:41:17.690 に答える