在Hibernate中使用注释映射多级继承

在Hibernate中使用注释映射多级继承,hibernate,inheritance,Hibernate,Inheritance,以问题中列出的情况为例: 如何使用注释而不是hbm文件完成此映射?将自动拾取。因此,如果类A被注释,类B也被注释为@Entity并扩展了A,而C扩展了B,并且也被@Entity注释了,那么所有这些都将被拾取 我没有将连接子类与鉴别器值结合使用,但我确信它与XML中的操作非常相似(使用@DiscriminatorColumn和@DiscriminatorValue)您在具体操作中遇到了什么问题?映射类层次结构非常简单: @Entity @Inheritance(strategy=Inherita

以问题中列出的情况为例:

如何使用注释而不是hbm文件完成此映射?

将自动拾取。因此,如果类A被注释,类B也被注释为@Entity并扩展了A,而C扩展了B,并且也被@Entity注释了,那么所有这些都将被拾取


我没有将连接子类与鉴别器值结合使用,但我确信它与XML中的操作非常相似(使用@DiscriminatorColumn和@DiscriminatorValue)

您在具体操作中遇到了什么问题?映射类层次结构非常简单:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class A implements Serializable { ... }

@Entity
public class B extends A { ... }

@Entity
@PrimaryKeyJoinColumn(name="A_ID")
public class C extends A { ... }

@Entity
@PrimaryKeyJoinColumn(name="B_ID")
public class D extends B { ... }

更新(根据Michal的评论)

如果您确实想使用鉴别器(并且您应该有这样做的好的理由),可以通过以下方式混合使用:

这种方法的缺点是必须为映射的每个属性显式指定表:

public class D extends B {
  @Column(table="D_table")
  private String someProperty;

  ...
}

这正是适合我的东西:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="LoanType",discriminatorType="String")
@Table(name = "A")
public class A implements Serializable{
}

@Entity
@Table(name= "B")
@PrimaryKeyJoinColumn(name = "B_ID", referencedColumnName ="A_ID")
public class B extends A{
}


@Entity
@Table(name= "C")
@PrimaryKeyJoinColumn(name = "C_ID", referencedColumnName = "B_ID")
public class C extends B{}

这是不正确的。你们提到的隐式多态性和实际映射的类层次结构之间有很大的区别。你们能详细说明一下这句话吗?我没有意识到我暗指的是内隐多态性,也不是有意的。我想描述一个层次结构,即“在@Entity注释类之间的继承是自动拾取的”——这就是隐式多态性。为了映射实际的类层次结构,您必须使用
@heritation
显式地注释根类(另外根据选择的策略使用附加注释)。我认为这不是问题所在。据我所知,他想使用鉴别器列。这就是为什么我的答案“买你的”在这里的声誉要高得多,所以我很可能是错的:-)@Michal-OP在任何地方都没有提到discriminator。他联系到的问题说,使用鉴别器是出于历史原因,但并没有说他想继续使用。无论如何,如果OP确实想使用鉴别器,这很容易——我已经更新了我的答案来展示一个例子。结果证明我的思路是正确的,但我的hbm中有一个更基本的问题,导致我的注释无法被提取。无论如何,谢谢你的明确回答。干杯但是有一个问题,为什么你说“你应该有一个好的理由”来使用鉴别器?我们的应用程序不止一次使用鉴别器将类映射到单个表。看来效果很好。您所指的缺点是什么?使用逐层次表策略很好;缺点是每行中有多个null(并且不能对非根类具有notnull约束)。每个具体类使用表策略也很好;缺点是连接。当你把两者结合在一起时,你会得到两个世界中最坏的结果,而且很少有理由这样做。
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="LoanType",discriminatorType="String")
@Table(name = "A")
public class A implements Serializable{
}

@Entity
@Table(name= "B")
@PrimaryKeyJoinColumn(name = "B_ID", referencedColumnName ="A_ID")
public class B extends A{
}


@Entity
@Table(name= "C")
@PrimaryKeyJoinColumn(name = "C_ID", referencedColumnName = "B_ID")
public class C extends B{}