【问题标题】:Discrimination based on the value of foreign key Hibernate ORM mapping基于Hibernate ORM映射外键值的判别
【发布时间】:2012-05-30 13:56:51
【问题描述】:

我正在尝试对一个表执行自引用映射(父/子关系)映射。

我想要的是来自同一张表的两个不同的实体,这样我就可以分离属性等等。我正在考虑使用鉴别器值,但我不能,因为我的数据库已经定义如下:为了区分父级和子级,我们有列 parent_id 对于子类型不为空(parent_id 当然是外键到同一张桌子)。无法通过以下方式定义鉴别器值:如果对象是父类型,则鉴别器值为 null 否则为子类型。

我一直在寻找解决方案,但我有点卡住了。也许,我最终会使用一个具有两个属性的实体,这些属性指的是父级(子级不是 null,@ManyToOne)和子级列表(子级@OneToMany null)。但在那之前(此刻,我必须决定使用一个实体),我想问一下是否有变通办法来执行我想做的事情。

【问题讨论】:

    标签: hibernate orm mapping self-reference


    【解决方案1】:

    鉴别器可以是“公式”。这严格来说是 Hibernate 特性,JPA 不支持。你会使用@org.hibernate.annotations.DiscriminatorFormula,类似于:

    @Entity
    @Inheritance(strategy=SINGLE_TABLE)
    @DiscriminatorFormula( "case when parent_id is null then 'PARENT' ELSE 'CHILD' end" )
    @DiscriminatorValue("PARENT")
    public class Parent {
        ...
    }
    
    // map Child using @DiscriminatorValue("CHILD")
    

    【讨论】:

    • 感谢您的回答。直到现在我才知道这个功能。这正是我想要的。到目前为止,我们只被允许使用 JPA 支持的 Hibernate 特性,我希望这可能是个例外。不管怎样,我想从现在开始,我会在我的个人项目中使用这个功能。再次感谢您!
    【解决方案2】:

    另一种解决方案是利用特殊的 Hibernate 值 @DiscriminatorValue("null")@DiscriminatorValue("not null")

    @Entity
    @Inheritance(strategy=SINGLE_TABLE)
    @DiscriminatorColumn("parent_id")
    @DiscriminatorValue("null")
    public class Parent {
        ...
    }
    
    @Entity
    @DiscriminatorValue("not null")
    public class Child extends Parent {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 1970-01-01
      • 2011-03-20
      • 2015-07-28
      • 2012-08-17
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多