一对多关系的JPA更新列表
JPA update list of one to many relationship
我有一个 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;
}
然后我想用一组新的替代列表更新现有的问题条目。为此,我使用新的问题对象调用 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;
我有一个 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;
}
然后我想用一组新的替代列表更新现有的问题条目。为此,我使用新的问题对象调用 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;