3

我的数据库中有一个多对多(带有连接表)关系,我需要在休眠中建模。

我对数据库中的所有三个表都有 POJO 类,因为连接表包含的不仅仅是映射信息。

我的问题发生在 A 类的 save() 上,其中 A 类被告知要级联到 AB 类(连接表),AB 类被告知要级联到 B 类,但是当它到达将 AB 保存为外键引用的地步时到表 A 为空。

归根结底,我希望能够在 TableA 类的实例上调用 save() 并让它保存所有三个表。

表格图

表 A 映射

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Aug 27, 2012 2:16:37 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.example.dbtables.TableA" table="Table A">
        <id name="id" type="int">
            <column name="id" />
            <generator class="sequence">
                <param name="sequence">table_a_seq</param>
            </generator>
        </id>
        <natural-id>
        <property name="data1" type="int">
            <column name="DATA1" not-null="true" />
        </property>
        <property name="data2" type="string">
            <column name="DATA2" length="16" not-null="true" />
        </property>
        </natural-id>
        <set name="tableAB" cascade="save-update" table="TableAB" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="Table_AB_ID" not-null="true" />
            </key>
            <one-to-many class="com.example.dbtables.TableAB" />
        </set>
    </class>
</hibernate-mapping>

表 AB 映射

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Aug 27, 2012 2:16:37 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.example.dbtables.TableAB" table="Table AB">
        <id name="id" type="int">
            <column name="id" />
            <generator class="sequence">
                <param name="sequence">table_ab_seq</param>
            </generator>
        </id>
        <natural-id>
        <many-to-one name="tableA" class="com.example.dbtables.TableA" fetch="select">
            <column name="Table_A_ID" not-null="true" />
        </many-to-one>
        <many-to-one name="tableB" cascade="save-update" class="com.example.dbtables.TableB" fetch="select">
            <column name="Table_B_ID" not-null="true" />
        </many-to-one>
        <property name="data1" type="int">
            <column name="DATA1" not-null="true" />
        </property>
            <property name="data2" type="int">
            <column name="DATA2" not-null="true" />
        </property>
        </natural-id>
    </class>
</hibernate-mapping>

表 B 映射

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Aug 27, 2012 2:16:37 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.examples.dbtables.TableB" table="Table B">
        <id name="id" type="int">
            <column name="id" />
            <generator class="sequence">
                <param name="sequence">table_b_seq</param>
            </generator>
        </id>
        <natural-id>
        <property name="data1" type="string">
            <column name="DATA1" length="16" />
        </property>
        <property name="data2" type="java.lang.Integer">
            <column name="DATA2" />
        </property>
        </natural-id>
        <set name="TableAB" table="Table AB" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="Table_AB_ID" not-null="true" />
            </key>
            <one-to-many class="com.example.dbtables.TableAB" />
        </set>
    </class>
</hibernate-mapping>

谢谢你提供的所有帮助。如果您需要澄清或更多信息,请告诉我。

编辑:我的问题是从 AB -> 到 A 的引用没有正确填充。感谢所有提供帮助的人,此问题已得到解决。

4

2 回答 2

0
  A a = new A();
  B b = new B();
  AB ab = new AB();
  ab.setA(a);
  ab.setB(b);
  a.setAB(ab);
  b.setAB(ab);

  save(a);  

这个例子不起作用?你有什么例外吗?
编辑
查看此 Hibernate 文档 第 5 章。基本 O/R 映射到第5.1.4.1 章。生成器
PostgreSQL不支持身份生成类型。
使用序列生成而不是身份,或其他东西

于 2012-09-13T15:13:49.573 回答
0

问题是 AB -> A 之间的反向引用没有正确填充到我的代码中。感谢伊利亚的帮助。

于 2012-09-18T16:37:55.747 回答