【问题标题】:JPA Inheritence IdClassJPA 继承 IdClass
【发布时间】:2014-02-18 04:34:31
【问题描述】:

多继承实体复合键情况下如何使用IdClass?

    @IdClass(IdClassEntity1.class)
    class Entity1 {
    private long e1pk1;
    private long e1pk2;
    }
    @IdClass(IdClassEntity2.class)
    class Entity2 extends Entity1  {
    private long e2pk1;
    private long e2pk2;
    }
    class Entity3 extends Entity2 {
    private long e3pk1;
    private long e3pk2;
    }

IdClassEntity2 应该是什么:

class IdClassEntity2 {
        private long e1pk1;
        private long e1pk2;
        private long e2pk1;
        private long e2pk2;
}

class IdClassEntity2 {
        private IdClassEntity1 idClassEntity1;
        private long e2pk1;
        private long e2pk2;
}

【问题讨论】:

  • 它们是默认映射的,只需要添加MappedSuperClass或@Entity即可,不需要在子类中重新定义。

标签: java jpa orm jpa-2.0


【解决方案1】:

您可以使用@MappedSuperClass@Entity 来声明@IdClass。 pk 通过继承传播。

例如,使用@MappedSuperClass,您可以执行以下操作:

@MappedSuperClass
@IdClass(IdClassEntity1.class)
public class Entity1 {
    @Id private long e1pk;    
    @Id private long e1pk;
    ...

 @Entity
 public class Entity2 extends Entity1 {
    ...

使用@Entity,遵循相同的范例

【讨论】:

  • 所以 SubClass Hierarchy 不能用 Super PK 定义他们自己的 Pk 意味着:Super(PK1,PK2) , SubClass1(PK3) 和 SubClass2(PK4)
  • @hiddenuser:不,他们不能定义他们的 PK。层次结构中的所有实体类共享来自@MappedSuperclass 实体的相同复合键,以便您可以在它们上调用em.find()。从数据库的角度来看,层次结构中的所有实体实例都存储在同一个表中,并且每个实体类型都被鉴别器识别。考虑到您无法实例化和查询 Entity1,因为它不是持久的。
  • 这是一个巨大的限制,恕我直言。子类应该定义自己的附加 PK
猜你喜欢
  • 2014-03-25
  • 2012-12-02
  • 2011-08-20
  • 2011-09-04
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
相关资源
最近更新 更多