使用join和type映射继承

时间:2011-10-06 14:47:10

标签: hibernate inheritance jpa

我有一个非常基本的问题。假设我有一个类层次结构A< -B(class B extends class A)。两者都是bean并通过hibernate保存到数据库中。为了映射层次结构,到目前为止我知道两种方法:

  1. 全部在同一个表格中:A和B将保存在一个表格中,字段type将标识该条目是来自A类还是B类。
  2. 每种类型的一个表:当保存B对象时,Hibernate会将它放在B表中,并且还会在A表中创建一个条目。 ID将是相同的,以确保它是一个对象。
  3. 现在我想把这两个结合起来:每当我从B类保存一个对象时,它应该被写入B表以及A表。但是在A表中也应该有一个字段“type”,其中显示了每个条目的类型。

    我在class A中使用以下注释尝试了它:

    @Inheritance(strategy = InheritanceType.JOINED)
    @DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
    

    第一个定义每个对象将保存到单独的表中,第二个应该将类型写入类型字段。

    Class B有这样的注释:

    @DiscriminatorValue("B")
    

    但不幸的是,这不起作用。当我想将A对象插入A表时,它会将此条目保存两次,然后给出一个错误,表明该密钥已被使用。所以我想这不是正确的做法。

    有人可以帮我吗?我发现的教程对我来说相当混乱,因为我对这个主题很新。此外,大多数解释都使用XML文件而不是注释。

2 个答案:

答案 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不需要任何鉴别器,因此您可以将其删除,或将其视为基本列。