使用Annotations在Hibernate中映射多级继承

eva*_*ard 5 inheritance hibernate

请考虑此问题中列出的情况:

在Hibernate中映射多级继承

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

Chs*_*y76 10

你有什么特别的麻烦?通过连接的子类映射类层次结构非常简单:

@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 { ... }
Run Code Online (Sandbox Code Playgroud)

更新(根据Michal的评论).

如果您确实想使用鉴别器(并且您应该有充分的理由这样做),可以通过将每个类的层次结构策略辅助表混合来实现:

@Entity
@Table(name="A_table")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="entity_type")
@DiscriminatorValue("A")
public class A implements Serializable { ... }

@Entity
@SecondaryTable(name="B_table")
public class B extends A { ... }

@Entity
@SecondaryTable(name="C_table", pkJoinColumns={
    @PrimaryKeyJoinColumn(name="A_ID", referencedColumnName="ID")
))
public class C extends A { ... }

@Entity
@SecondaryTable(name="D_table", pkJoinColumns={
    @PrimaryKeyJoinColumn(name="B_ID", referencedColumnName="ID")
))
public class D extends B { ... }
Run Code Online (Sandbox Code Playgroud)

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

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

  ...
}
Run Code Online (Sandbox Code Playgroud)