Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过与hibernate的多对多关系级联存储?_Java_Hibernate_Postgresql_Orm_Many To Many - Fatal编程技术网

Java 如何通过与hibernate的多对多关系级联存储?

Java 如何通过与hibernate的多对多关系级联存储?,java,hibernate,postgresql,orm,many-to-many,Java,Hibernate,Postgresql,Orm,Many To Many,我的数据库中有一个需要在hibernate中建模的多对多(带有联接表)关系 我为数据库中的所有三个表都提供了POJO类,因为join表包含的不仅仅是映射信息 我的问题发生在类A的save()上,其中类A被告知级联到类AB(联接表),类AB被告知级联到类B,但当它到达保存AB的点时,表A的外键引用为null 最后,我希望能够对TableA类的实例调用save(),并让它保存所有三个表 表A映射 <?xml version="1.0"?> <!DOCTYPE hibernate-

我的数据库中有一个需要在hibernate中建模的多对多(带有联接表)关系

我为数据库中的所有三个表都提供了POJO类,因为join表包含的不仅仅是映射信息

我的问题发生在类A的save()上,其中类A被告知级联到类AB(联接表),类AB被告知级联到类B,但当它到达保存AB的点时,表A的外键引用为null

最后,我希望能够对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>

表a
表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>
<?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>

表1附录2
表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的引用没有正确填充。多亏大家的帮助,这个问题才得以解决

  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.1.4.1章。发电机
PostgreSQL不支持标识生成类型。

使用序列生成而不是标识,或者其他什么

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

我没有收到异常,但我收到一条错误消息,说明无法在表AB上进行保存,因为它违反了NOTNULL约束。您提供的示例基本上就是我正在做的,但是我使用JAXB将我已经拥有的一些数据膨胀到我的类中。我记得这个错误“它违反了NOTNULL约束”。这意味着AB中的A或B为空,或者A或B中的AB为空。在保存之前调试对象是的,这就是我看到的错误。“保存前调试对象”是什么意思?我知道表A的id在表AB中为空,因为级联沿着链走,而表A还没有保存。我注意到,我在示例中修复了生成器部分,但当我在代码库中更改它们时,我仍然遇到同样的问题。