gpt4 book ai didi

java - 如何避免 Hibernate 为 OneToMany 的更新生成两个查询?

转载 作者:行者123 更新时间:2023-12-04 11:32:15 24 4
gpt4 key购买 nike

我面临与 this question 相同的情况,这没有有用的答案。

当我向一对多关系的许多部分添加一个新元素时,Hibernate 会生成两个查询,一个用于插入,另一个用于将外键更新到父级。

为什么需要第二个查询?不是在插入中设置了父级的 id 吗?
有没有办法避免这种情况?

    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);
}
}

最佳答案

关联是单向的,所以 Person是拥有方(因为它是唯一的一方)。

使关联双向并使 LanguageKnowledge协会所有者。这样您将避免冗余更新,因为外键值将被指定为 LanguageKnowledge 的插入语句的一部分。 .

关于java - 如何避免 Hibernate 为 OneToMany 的更新生成两个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35223952/

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