Java 如何通过与hibernate的多对多关系级联存储?
我的数据库中有一个需要在hibernate中建模的多对多(带有联接表)关系 我为数据库中的所有三个表都提供了POJO类,因为join表包含的不仅仅是映射信息 我的问题发生在类A的save()上,其中类A被告知级联到类AB(联接表),类AB被告知级联到类B,但当它到达保存AB的点时,表A的外键引用为null 最后,我希望能够对TableA类的实例调用save(),并让它保存所有三个表 表A映射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-
<?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还没有保存。我注意到,我在示例中修复了生成器部分,但当我在代码库中更改它们时,我仍然遇到同样的问题。