Java 如何避免Hibernate为OneToMany的更新生成两个查询?
我面临着与中相同的情况,这没有有用的答案 当我向一对多关系的多部分添加新元素时,Hibernate会生成两个查询,一个用于插入,另一个用于将外键更新到父项 为什么它需要第二个查询?家长的id不是在插入中设置的吗? 有没有办法避免这种情况Java 如何避免Hibernate为OneToMany的更新生成两个查询?,java,hibernate,one-to-many,hibernate-onetomany,Java,Hibernate,One To Many,Hibernate Onetomany,我面临着与中相同的情况,这没有有用的答案 当我向一对多关系的多部分添加新元素时,Hibernate会生成两个查询,一个用于插入,另一个用于将外键更新到父项 为什么它需要第二个查询?家长的id不是在插入中设置的吗? 有没有办法避免这种情况 Hibernate: /* insert mydomain.LanguageKnowledge */ insert into languageKnowledg
Hibernate:
/* insert mydomain.LanguageKnowledge */
insert
into
languageKnowledge
(language_fk, level_fk, personId_fk)
values
(?, ?, ?)
Hibernate:
/* create one-to-many row mydomain.Person.offeredLanguages */
update
languageKnowledge
set
personId_fk=?
where
id=?
public class LanguageKnowledge {
@Id
@GeneratedValue(strategy = IDENTITY)
private Integer id;
@Enumerated(STRING)
@Column(name = "language_fk")
private LanguageIso639_3 language;
@Enumerated(STRING)
@Column(name = "level_fk")
private LanguageLevel level;
protected LanguageKnowledge() {
}
}
public class Person {
@Id
@GeneratedValue(strategy = IDENTITY)
private Integer id;
@OneToMany(fetch = EAGER, cascade = {ALL}, orphanRemoval = true)
@JoinColumn(name = "personId_fk", referencedColumnName = "id", nullable = false)
private final Set<LanguageKnowledge> offeredLanguages = new HashSet<>();
public Person(Set<LanguageKnowledge> offeredLanguages) {
addOfferedLanguages(offeredLanguages);
}
protected Person() {
}
public void addOfferedLanguages(Set<LanguageKnowledge> offeredLanguages) {
this.offeredLanguages.addAll(offeredLanguages);
}
public void removeOfferedLanguages(Set<LanguageKnowledge> offeredLanguagesToRemove) {
this.offeredLanguages.removeAll(offeredLanguagesToRemove);
}
}
休眠:
/*插入mydomain.LanguageKnowledge*/
插入
进入
语言知识
(语言、级别、拟人)
价值观
(?, ?, ?)
冬眠:
/*创建一到多行mydomain.Person.offeredLanguages*/
更新
语言知识
设置
personId_fk=?
哪里
id=?
公共课语言知识{
@身份证
@生成值(策略=标识)
私有整数id;
@枚举(字符串)
@列(name=“language\u fk”)
专用语言ISO639_3语言;
@枚举(字符串)
@列(name=“level\u fk”)
私人语言水平;
受保护语言知识(){
}
}
公共阶层人士{
@身份证
@生成值(策略=标识)
私有整数id;
@OneToMany(fetch=EAGER,cascade={ALL},orphanRemoving=true)
@JoinColumn(name=“personId\u fk”,referencedColumnName=“id”,nullable=false)
private final Set offeredLanguages=新HashSet();
公众人士(提供的一套语言){
添加提供的语言(提供的语言);
}
受保护人(){
}
public void addOfferedLanguages(设置offeredLanguages){
this.offeredLanguages.addAll(offeredLanguages);
}
public void removeOfferedLanguages(设置OfferedLanguagesStoreMove){
this.offeredLanguages.removeAll(offeredLanguagesToRemove);
}
}
关联是单向的,因此个人
是拥有方(因为它是唯一的一方)
使关联双向并使
LanguageKnowledge
成为关联所有者。这样可以避免冗余更新,因为外键值将被指定为LanguageKnowledge
要避免的查询的insert语句的一部分?两者似乎都很有用……@JordiCastilla第二个,更新。编辑了我的问题。谢谢你的回答,但是你能不能说,为什么它要更新?因为当我看到日志时,在childInsert
query中,它已经添加了外键。因此,它只是更新相同值的现有fk(冗余操作)。