gpt4 book ai didi

java - hibernate 外键未在 SaveOrUpdate 上更新

转载 作者:行者123 更新时间:2023-11-30 10:36:50 25 4
gpt4 key购买 nike

我在 hibernate 映射中声明了父/子关系。 Parent 包含 Child 对象的集合。当我创建并保存包含新子对象的新父对象时,出现错误:

Cannot insert NULL into ("SCHEMA"."ACCESS_LIST_MEMBERS"."LIST_ID")

这是父映射:

<hibernate-mapping>
<class name="AccessLists" optimistic-lock="version" schema="schema" table="ACCESS_LISTS">
<id name="id" type="java.lang.Integer">
<column name="ID" precision="38" scale="0"/>
<generator class="sequence">
<param name="sequence">ACCESS_LISTS_SEQ</param>
</generator>
</id>
<property name="userId" type="java.lang.Integer">
<column name="USER_ID" not-null="true" precision="38" scale="0"/>
</property>
<property name="name" type="string">
<column length="30" name="NAME" not-null="true"/>
</property>
<set name="accessListMembers" cascade="all" table="ACCESS_LIST_MEMBERS" inverse="false" fetch="select">
<key>
<column name="LIST_ID" precision="38" scale="0" not-null="true" />
</key>
<one-to-many class="AccessListMembers" />
</set>
</class>
</hibernate-mapping>

子映射:

<hibernate-mapping>
<class name="AccessListMembers" optimistic-lock="version" schema="schema" table="ACCESS_LIST_MEMBERS">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="sequence">
<param name="sequence">ACCESS_LIST_MBRS_SEQ</param>
</generator>
</id>
<property name="listId" type="java.lang.Integer">
<column name="LIST_ID" not-null="true" />
</property>
<property name="wwid" type="string">
<column length="5" name="WWID" not-null="true"/>
</property>
<join table="AccessLists" inverse="true">
<key column="ID"/>
<many-to-one name="accessList" column="LIST_ID" not-null="true"/>
</join>
</class>
</hibernate-mapping>

我认为在子映射中添加 join 信息会让 hibernate 知道从父对象 ACCESS_LIST.ID 获取 LIST_ID,但这并没有发生。执行此代码时出现错误:

public static void saveList(AccessLists list) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
try {
session.saveOrUpdate(list);
tx.commit();
} catch (Exception e) {
tx.rollback();
throw e;
}
}

我不想在 AccessList 的 AccessListMembers 集合中的每个对象上手动设置 LIST_ID。我已经阅读了 JBOSS 文档,但我认为我误解了一对多和多对一关系的工作原理。

如何设置我的映射,以便 Hibernate 知道在 AccessList 上执行 INSERT,在 AccessListMembers 上更新 LIST_ID,并在 AccessListMembers 上执行 INSERT?

最佳答案

您必须双重绑定(bind)父项和子项。您将 child 绑定(bind)到 parent ,好的 - 但您没有像这样将 parent 绑定(bind)到 child :

accessListMember.setList(accessList);

顺便说一句,您可能需要进行技术审查并介绍 IoC。自己使用交易是一门古老、神秘且危险的知识。我看到程序员必须使用事务,因为他们必须使用事务保存点,如果是您的情况,请玩得开心。

关于java - hibernate 外键未在 SaveOrUpdate 上更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40428913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com