【问题标题】:Hibernate Table per Hierarchy How to每个层次结构的休眠表 如何
【发布时间】:2009-06-05 21:56:47
【问题描述】:

我想使用 hibernate 来包含对象的层次结构,但是鉴别器列是另一个表的外键,该表包含定义子类类型的 CODE。

是否可以将连接表中的代码指定为鉴别器,还是我必须使用键值并希望键保持一致?

例如discriminator="square|circle" vs.鉴别器="0|1"

表格:形状

area=25   shape_type_fk=0
area=10   shape_type_fk=1

表格:shape_types

ID CODE
0  square
1  circle 

【问题讨论】:

    标签: hibernate inheritance


    【解决方案1】:

    快速测试表明您可以这样做:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping default-access="field">
    
      <class name="Shape" abstract="true">
        <id name="id"/>
        <discriminator formula="select CODE from SHAPE_TYPES st where st.ID=SHAPE_TYPE"/>
        <version name="version"/>
    
        <subclass name="Square" discriminator-value="square"/>
        <subclass name="Circle" discriminator-value="circle"/>
    
      </class>
    </hibernate-mapping>
    

    现在此映射不会创建公式中引用的SHARE_TYPE 表,也不会将SHAPE_TYPE 列添加到SHAPE 表中。您可以在 Hibernate 从类路径中自动读取的 import.sql 文件中执行此操作,或者通过将另一个类映射到此表来执行此操作。

    【讨论】:

    • Maarten 的示例有效,但需要在鉴别器公式周围加上括号,并且子选择中的列必须引用别名表。此外,使用子类的标准会导致相关的子查询,这是非常低效的。我想我将不得不在没有多态(每个表)层次结构的情况下生活。
    【解决方案2】:

    看起来您需要使用joined-subclass 而不是子类。详情here

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多