我是JPA / Hibernate的新手,我想知道,更新复杂实体的最佳方法是什么?
例如,请考虑以下实体:
@Entity
public class Employee {
@Id
private long id;
@Column
private String name;
@ManyToMany
private List<Positions> positions;
// Getters and setters...
}
更新职位参考的最佳方法是什么?目前,服务正在向我传递员工应该拥有的职位列表。创建它们很简单:
for (long positionId : positionIdList) {
Position position = entityManager.find(positionId);
employee.getPositions.add(position);
}
entityManager.persist(employee);
但是,在更新员工时,我不确定更新员工职位的最佳方式是什么。我认为有两种选择:
我解析位置ID列表,并确定是否需要添加/删除位置(这似乎不是一个有趣的过程,最终可能会有很多删除查询)
< / LI>我删除所有位置,然后重新添加指定的位置。在JPA / Hibernate中有一种方法可以用一个sql命令删除所有子节点(在本例中为position)吗?
我是否以错误的方式思考这个问题?你们推荐什么?
答案 0 :(得分:1)
JPA / Hibernate对此有所支持。它被称为级联。通过使用@ManyToMany(cascade=CascadeType.ALL)
(或将级联类型限制为PERSIST
和MERGE
),您可以指定在拥有对象时应该保留(合并/删除/等)集合。
当涉及删除时,有一种特殊情况,即对象在数据库中变成“孤儿”。这可以通过设置orphanRemoval=true
答案 1 :(得分:1)
怎么样
employee.getPositions.clear(); // delete all existing one
// add all of them again
for (long positionId : positionIdList) {
Position position = entityManager.find(positionId);
employee.getPositions.add(position);
}
虽然它可能不是最有效的方法。有关详细讨论,请参阅here。 级联在这里没有多大帮助,因为在ManyToMany关系中,职位可能不会因为他们可能附加到其他员工而成为孤儿,或者甚至根本不应该被删除,因为他们可以独立存在。