gpt4 book ai didi

hibernate - 一对多关系的JPA更新列表

转载 作者:行者123 更新时间:2023-12-01 10:37:17 24 4
gpt4 key购买 nike

我有一个 Question 实体,其中包含一个名为 Alternatives 的实体列表,如下所示:

public class Question {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "question", cascade = CascadeType.ALL)
@JsonManagedReference
private List<Alternative> alternativeList;
}

public class Alternative implements Serializable {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "questionId", nullable = false)
@JsonBackReference
private Question question;

}

然后我想用一组新的替代列表更新一个现有的问题条目。为此,我使用新的 Question 对象调用 JpaDao 元素的合并方法:
@Repository
public class JpaQuestionDao implements QuestionDao {
@PersistenceContext
private EntityManager em;

@Transactional
public Question update(Question question) {
return em.merge(question);
}
}

然而,这实际上是在合并两个列表:一个已经在数据库中的一个和新提供的一个。当我有非列表对象时,我对这种方法没有任何问题,这就是我一直使用合并方法的原因。

有没有不合并而只更新列表的替代方法?

最佳答案

首先使用 EntityManager.find() 检索问题对象。问题对象将因此被管理。由于alternativeList 是延迟加载的,因此您必须在集合对象上调用一个方法来获取它并对其进行管理。对问题对象和列表的任何更新都将自动发送到数据库。

@Transactional
public Question update(Question question) {
Question q = em.find(Question.class, question.getId());
q.setAlternativeList(null);
q.setAlternativeList(question.getAlternativeList());
...

return q;
}

或者,您可以尝试在 @OneToMany 集合上使用 orphanRemoval=true
@OneToMany(fetch = FetchType.LAZY, mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval=true)
@JsonManagedReference
private List<Alternative> alternativeList;

关于hibernate - 一对多关系的JPA更新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32980044/

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