Fel*_*sso 3 merge hibernate jpa entitymanager
我有一个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;
}
Run Code Online (Sandbox Code Playgroud)
然后,我想用一组新的“替代”列表更新一个退出的“问题”条目。为此,我用新的Question对象调用了JpaDao元素的merge方法:
@Repository
public class JpaQuestionDao implements QuestionDao {
@PersistenceContext
private EntityManager em;
@Transactional
public Question update(Question question) {
return em.merge(question);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这实际上是合并两个列表:一个已经在数据库中,另一个是新提供的。当我有非列表对象时,这种方法没有任何问题,这就是为什么我一直使用merge方法的原因。
是否有不合并但仅更新列表的替代方法?
首先使用EntityManager.find()检索问题对象。结果将成为问题对象。由于alternativeList是延迟加载的,因此您必须在collections对象上调用一个方法来获取它并使它也受到管理。对Question对象和列表的任何更新将自动发送到数据库。
@Transactional
public Question update(Question question) {
Question q = em.find(Question.class, question.getId());
q.setAlternativeList(null);
q.setAlternativeList(question.getAlternativeList());
...
return q;
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以尝试在@OneToMany集合上使用orphanRemoval = true
@OneToMany(fetch = FetchType.LAZY, mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval=true)
@JsonManagedReference
private List<Alternative> alternativeList;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12022 次 |
最近记录: |