Hibernate JPA一对多关系的更新列表

Hibernate JPA一对多关系的更新列表,hibernate,jpa,merge,entitymanager,Hibernate,Jpa,Merge,Entitymanager,我有一个问题实体,其中包含另一个实体的列表,称为备选方案,如下所示: public class Question { @OneToMany(fetch = FetchType.LAZY, mappedBy = "question", cascade = CascadeType.ALL) @JsonManagedReference private List<Alternative> alternativeList; } public class Alterna

我有一个问题实体,其中包含另一个实体的列表,称为备选方案,如下所示:

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;

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


是否有其他方法不合并而只更新列表?

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

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

    return q;
}
或者,您可以尝试在@OneToMany集合上使用orphaneremovation=true

@OneToMany(fetch = FetchType.LAZY, mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval=true)
@JsonManagedReference
private List<Alternative> alternativeList;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“question”,cascade=CascadeType.ALL,orphan=true)
@JsonManagedReference
私有列表替代列表;

这个问题仍然存在:(我将altList设置为q.setAlternativeList(question.getAlternativeList());嗯,你到底想对列表做什么?我的意思是,当列表到达数据库时,你对列表内容有什么期望?例如,我在数据库中有项目1、2和3。然后我想调用更新方法,在新的备选列表中传递一个新的问题对象,让我们假设1、2和5(而不是3)。与此相反,我得到的是一个包含1、2、3、1、2和5的备选列表。请尝试更新的代码。我首先通过将列表设置为null删除了该列表,然后更新了该列表。或者,您可以尝试@OneToMany annotation.@Ish“对问题对象和列表的任何更新都将自动发送到数据库。”错误,
问题
是关联的反面。
删除
将起作用(
问题
备选方案
中不可为空,因此我假设OP打算删除未使用的
备选方案
)。
@OneToMany(fetch = FetchType.LAZY, mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval=true)
@JsonManagedReference
private List<Alternative> alternativeList;