【问题标题】:Mapping inheritance with joined and type使用连接和类型映射继承
【发布时间】:2011-10-06 14:47:10
【问题描述】:

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

  1. 都在同一张表中:A 和 B 将保存在一张表中,type 字段将识别条目是来自 A 类型还是 B 类型。
  2. 每种类型一个表:当一个 B 对象被保存时,Hibernate 会将它放到 B 表中,同时也会在 A 表中创建一个条目。 ID 将相同,以确保它是一个对象。

现在我想将这两者结合起来:每当我保存类型 B 的对象时,它应该写入 B 表以及 A 表。但是A表中也应该有一个字段“type”,其中显示了每个条目的类型。

我已经在class A 中使用以下注释进行了尝试:

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

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

Class B 有这个注解:

@DiscriminatorValue("B")

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

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

【问题讨论】:

    标签: hibernate inheritance jpa


    【解决方案1】:

    如果您的提供者不允许通过@Inheritance 半自动执行此操作,只需将一个持久属性“type”添加到 A 类并在 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";
        }
    }
    

    【讨论】:

      【解决方案2】:

      使用注解这似乎是不可能的:见https://hibernate.onjira.com/browse/ANN-140。如果您使用 XML 文件来映射这些实体,这是可能的,并且记录在参考文档中。

      请注意,Hibernate 不需要任何鉴别器,因此您可以将其删除,或者将其视为基本列。

      【讨论】:

        猜你喜欢
        • 2015-05-23
        • 1970-01-01
        • 2021-12-17
        • 2012-11-16
        • 1970-01-01
        • 1970-01-01
        • 2012-03-20
        • 2015-07-01
        • 1970-01-01
        相关资源
        最近更新 更多