JPA 2 / Hibernate - 更新复杂实体的最佳方法?

时间:2011-02-19 23:37:34

标签: java hibernate jpa java-ee jpa-2.0

我是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);

但是,在更新员工时,我不确定更新员工职位的最佳方式是什么。我认为有两种选择:

  1. 我解析位置ID列表,并确定是否需要添加/删除位置(这似乎不是一个有趣的过程,最终可能会有很多删除查询)

    < / LI>
  2. 我删除所有位置,然后重新添加指定的位置。在JPA / Hibernate中有一种方法可以用一个sql命令删除所有子节点(在本例中为position)吗?

  3. 我是否以错误的方式思考这个问题?你们推荐什么?

2 个答案:

答案 0 :(得分:1)

JPA / Hibernate对此有所支持。它被称为级联。通过使用@ManyToMany(cascade=CascadeType.ALL)(或将级联类型限制为PERSISTMERGE),您可以指定在拥有对象时应该保留(合并/删除/等)集合。

当涉及删除时,有一种特殊情况,即对象在数据库中变成“孤儿”。这可以通过设置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关系中,职位可能不会因为他们可能附加到其他员工而成为孤儿,或者甚至根本不应该被删除,因为他们可以独立存在。

相关问题