我有一个非常基本的问题。假设我有一个类层次结构A< -B(class B
extends class A
)。两者都是bean并通过hibernate保存到数据库中。为了映射层次结构,到目前为止我知道两种方法:
type
将标识该条目是来自A类还是B类。现在我想把这两个结合起来:每当我从B类保存一个对象时,它应该被写入B表以及A表。但是在A表中也应该有一个字段“type”,其中显示了每个条目的类型。
我在class A
中使用以下注释尝试了它:
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
第一个定义每个对象将保存到单独的表中,第二个应该将类型写入类型字段。
Class B
有这样的注释:
@DiscriminatorValue("B")
但不幸的是,这不起作用。当我想将A对象插入A表时,它会将此条目保存两次,然后给出一个错误,表明该密钥已被使用。所以我想这不是正确的做法。
有人可以帮我吗?我发现的教程对我来说相当混乱,因为我对这个主题很新。此外,大多数解释都使用XML文件而不是注释。
答案 0 :(得分:0)
如果您的提供者不允许通过@Inheritance半自动,只需在A类中添加一个持久属性“type”,并在B中设置与A中不同的值。
最小例子:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class A {
@Id
private int id;
String type = "A";
}
@Entity
public class B extends A {
//initializer block is executed for all possible constructors
{
//writing over value set in A
type = "B";
}
}
答案 1 :(得分:0)
使用注释似乎不可能:见https://hibernate.onjira.com/browse/ANN-140。如果您使用XML文件映射这些实体,那么可以在参考文档中进行记录。
请注意,Hibernate不需要任何鉴别器,因此您可以将其删除,或将其视为基本列。