嵌套单表继承
问题描述:
我正面临对象模型和Hibernate的问题。我希望将整个模型存储为一个表格。嵌套单表继承
我尝试了以下方法,但是当我要求Hibernate生成SQL创建文件时,它会创建3个表格而不是1个。类层次结构可能看起来很奇怪,但是它取材于当然的上下文:)
尝试1:
@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "CATEGORY", discriminatorType = DiscriminatorType.STRING, length = 10)
@Table(name = "the_table")
public abstract class A {}
@MappedSuperclass
@DiscriminatorValue(value = "B")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 20)
public abstract class B extends A {}
@Entity
@DiscriminatorValue(value = "X")
public class X extends B {}
@Entity
@DiscriminatorValue(value = "Y")
public class Y extends B {}
@Entity
@DiscriminatorValue(value = "Z")
public class Z extends B {}
尝试2: 就快了,没有它创建1台,但不会产生鉴别列。任何人都可以发现错误?
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "CATEGORY", discriminatorType = DiscriminatorType.STRING, length = 10)
@DiscriminatorFormula(value = "CATEGORY || '_' || TYPE")
@Table(name = "the_table")
public abstract class A {}
@Entity
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 20)
public abstract class B extends A {}
@Entity
@DiscriminatorValue(value = "B_X")
public class X extends B {}
@Entity
@DiscriminatorValue(value = "B_Y")
public class Y extends B {}
@Entity
@DiscriminatorValue(value = "B_Z")
public class Z extends B {}
答
删除@MappedSuperclass并尝试。你也不能在一个层次中有两次@Inheritance标签 - 只会使用一个。
如果你想使用多列作为鉴别使用@DiscriminatorFormula
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorForumula("CATEGORY || '_' || TYPE")
public abstract class A
@Entity
@DiscriminatorValue(value = "B_X")
public class X extends A {}
@Entity
@DiscriminatorValue(value = "B_Y")
public class Y extends A {}
@Entity
@DiscriminatorValue(value = "B_Z")
public class Z extends A {}
我需要MappedSuperClass以字段映射到表。我试图从类B中删除继承注释,但没有运气。 – smox
您应该使用@Entity代替。我已经用我认为可行的映射更新了答案。 – gkamal
我已经添加了我的第二次尝试,但我们还没有完成... – smox