2011-12-12 148 views
0

我正面临对象模型和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 {} 

回答

2

删除@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 {} 
+0

我需要MappedSuperClass以字段映射到表。我试图从类B中删除继承注释,但没有运气。 – smox

+0

您应该使用@Entity代替。我已经用我认为可行的映射更新了答案。 – gkamal

+0

我已经添加了我的第二次尝试,但我们还没有完成... – smox