gpt4 book ai didi

java - 如何阻止 Hibernate 尝试更新一对多 Over Join 表

转载 作者:行者123 更新时间:2023-11-30 05:11:44 24 4
gpt4 key购买 nike

好吧,我的 Hibernate 映射和获得所需行为时遇到了一些问题。

基本上我拥有的是以下 Hibernate 映射:

<hibernate-mapping>
<class name="com.package.Person" table="PERSON" schema="MYSCHEMA" lazy="false">
<id name="personId" column="PERSON_ID" type="java.lang.Long">
<generator class="sequence">
<param name="sequence">PERSON_ID_SEQ</param>
</generator>
</id>

<property name="firstName" type="string" column="FIRST_NAME">
<property name="lastName" type="string" column="LAST_NAME">
<property name="age" type="int" column="AGE">

<set name="skills" table="PERSON_SKILL" cascade="all-delete-orphan">
<key>
<column name="PERSON_ID" precision="12" scale="0" not-null="true"/>
</key>
<many-to-many column="SKILL_ID" unique="true" class="com.package.Skill"/>
</set>
</class>
</hibernate-mapping>


<hibernate-mapping>
<class name="com.package.Skill" table="SKILL" schema="MYSCHEMA">
<id name="skillId" column="SKILL_ID" type="java.lang.Long">
<generator class="sequence">
<param name="sequence">SKILL_ID_SEQ</param>
</generator>
</id>
<property name="description" type="string" column="DESCRIPTION">
</class>
</hibernate-mapping>

因此,假设我已经在技能表中填充了一些技能。现在,当我创建一个新人员时,我想通过设置技能 ID 将其与技能表中已存在的一组技能相关联。例如:

Person p = new Person();
p.setFirstName("John");
p.setLastName("Doe");
p.setAge(55);

//Skill with id=2 is already in the skill table
Skill s = new Skill()
s.setSkillId(2L);

p.setSkills(new HashSet<Skill>(Arrays.asList(s)));
PersonDao.saveOrUpdate(p);

如果我尝试这样做,但我会收到一条错误消息:

WARN (org.slf4j.impl.JCLLoggerAdapter:357) - SQL Error: 1407, SQLState: 72000
ERROR (org.slf4j.impl.JCLLoggerAdapter:454) - ORA-01407: cannot update ("MYSCHEMA"."SKILL"."DESCRIPTION") to NULL

ERROR (org.slf4j.impl.JCLLoggerAdapter:532) - Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update

我认为我收到此错误的原因是因为 Hibernate 发现 ID 为 2 的技能已将其描述“更新”为 null(因为我从未设置过它)并尝试更新它。但我不希望 Hibernate 更新这个。我想要它做的是插入新的 Person p 并将一条记录插入到连接表 PERSON_SKILL 中,该记录将 p 与 SKILL 表中 id=2 的技能相匹配,而不触及 SKILL 表。

有什么办法可以实现这种行为吗?

最佳答案

而不是自己创建技能对象:

//Skill with id=2 is already in the skill table
Skill s = new Skill()
s.setSkillId(2L);
p.setSkills(new HashSet<Skill>(Arrays.asList(s)));

您应该从 Hibernate session 中检索它:

Skill s = (Skill) session.get(Skill.class, 2L);
p.setSkills(new HashSet<Skill>(Arrays.asList(s)));

这样 session 就认为p.skills中包含的技能是 persistent, and not transient .

关于java - 如何阻止 Hibernate 尝试更新一对多 Over Join 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3142806/

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