【发布时间】:2009-12-10 20:37:27
【问题描述】:
【问题讨论】:
标签: hibernate inheritance
【问题讨论】:
标签: hibernate inheritance
您遇到的具体问题是什么?映射类层次结构via joined subclasses 非常简单:
@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 的评论)。
如果您确实想使用鉴别器(并且您应该有好的理由这样做),可以将table-per-class-hierarchy strategy 与secondary tables 混合使用:
@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 { ... }
这种方法的缺点是您必须为每个映射的属性显式指定表:
public class D extends B {
@Column(table="D_table")
private String someProperty;
...
}
【讨论】:
Inheritance between @Entity annotated classes 被自动拾取。因此,如果您对 A 类进行了注解,并且 B 类也使用 @Entity 进行了注解并扩展了 A,并且 C 扩展了 B 并且也使用了@Entity 进行了注解,那么所有将被拾取。
我没有使用结合了鉴别器值的连接子类,但我确信它与在 XML 中所做的非常相似(使用 @DiscriminatorColumn 和 @DiscriminatorValue)
【讨论】:
@Inheritance 显式注释根类(加上根据选择的策略使用额外的注释)。
这正是对我有用的东西:
@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{}
【讨论】: