【问题标题】:Mapping single list to various tables depending on the class of its records根据记录的类别将单个列表映射到各种表
【发布时间】:2013-06-24 17:33:07
【问题描述】:

假设我们有一个 A 类,它有一个 B 类对象列表 (List<B> listOfBs)。在数据库设计中,这意味着代表 B 类的表应该有一个外键来引用代表 A 类的表的行。现在,B 类是 C、D 和 E 类的超类。 我的 A 类休眠映射文件如下,可以很好地将 A 类条目存储到数据库中,同时还可以级联包含在 A 类列表中的多个 B 类条目。

A 类休眠映射文件:

<hibernate-mapping package="..."> 
    <class name="A" table="table_of_A"> 
        <id name="key" column="A_ID"> 
            <generator class="native"/> 
        </id> 
        <property name="...." type="long"/>
        <property name="...." type="string"/>
        <list name="listOfBs" access="field" cascade="all">
               <key column="A_ID" not-null="true" />
               <list-index column="idx"/>
               <one-to-many class="B"/>
        </list>
    </class> 
</hibernate-mapping>

我试图弄清楚我应该在上面显示的休眠文件中包含什么,以便我可以将 listOfBs 存储在数据库中,它可能包含 C、D 和 E 类的对象,因此每个listOfBs 上的对象应转到数据库中的相应表。 请注意,我使用具有隐式多态策略的每个具体类的表来映射休眠上的继承。

任何帮助将不胜感激。提前致谢。

【问题讨论】:

标签: java hibernate polymorphism hibernate-mapping


【解决方案1】:

因此,在这里您使用每个具体类的表,并且将 B 作为超类,您可以使用休眠提供的泛化功能。

在hibernate中,可以通过三种不同的方式来表示继承。

1.每个类层次结构的表

2。每个子类的表

3.每个具体类的表

由于您使用的是table per concrete 类,因此您需要按以下方式更改 B 类映射

<class name="B">
<id name="id" column="ID">
    <generator class="sequence"/>
</id>
<property name="name" column="NAME"/>
<union-subclass name="C" table="C">
    <property name="${properties}" column="collumns"/>
</union-subclass>
<union-subclass name="D" table="D">
    <property name="${properties}" column="collumns"/>
</union-subclass>
<union-subclass name="E" table="E">
    <property name="${properties}" column="collumns"/>
</union-subclass>
</class>

This是参考链接,

【讨论】:

  • 我自己也试过了,&lt;generator class="sequence"&gt; 给了我“org.hibernate.exception.SQLGrammarException:无法获得下一个序列值”错误。我实际上使用了&lt;generator class="sequence"&gt; &lt;param name="sequence"&gt;B_id_seq&lt;/param&gt; &lt;/generator&gt;。如果有帮助,我正在使用 HSQL DB。
  • 尝试使用'native'或'increment'。
  • 'native' 不适用于 union-subclass。增量给我org.hibernate.exception.SQLGrammarException: could not fetch initial value for increment generator
猜你喜欢
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2016-01-20
  • 2020-04-18
  • 2020-05-02
  • 2011-01-14
相关资源
最近更新 更多