JPA更新一对多关系列表

2024-05-12

我有一个 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA更新一对多关系列表 的相关文章

随机推荐