在JPA双向OneToMany中删除实体

时间:2012-05-28 11:27:39

标签: jpa-2.0

我有两个实体User和Department,两个实体(OneToMany和ManyToOne)之间存在双向关系,我在一个服务类中管理关系,该服务类处理删除以及将用户添加到部门的关系:

List<User> originalUserList = userJpaRepository.findAllByDepartment(department);
for (Iterator<User> iterator = originalUserList.iterator(); iterator.hasNext();) {
    User user = iterator.next();
    if (!department.getDepartmentEmployees().contains(user)) {
        user.setDepartment(null);
        userJpaRepository.save(user);
    }
}
for (User user : department.getDepartmentEmployees()) {
    user.setDepartment(department);
    userJpaRepository.save(user);
}
Department savedDepartmetn = jpaRepository.save(department);
return savedDepartmetn;

一切正常添加和删除用户反映到数据库,但唯一的问题是在倒数第二行,isntance savedDepartment仍将包含已删除的用户,因为hibernate从更改完成之前的选择中填充其数据用户实际上是刷新到数据库。这里最好的方法是什么,

  • 我应该在保存部门之前进行刷新(如果保存部门失败,则会回滚事务)
  • 我应该在将savedInstance返回给调用者
  • 之前刷新savedInstance
  • 任何其他想法。

1 个答案:

答案 0 :(得分:2)

由于您使用的是附加实体,因此无需保存任何内容。 JPA会自动保留您对附加实体所做的更改。

当您进行双向关联时,您有责任在两侧进行更改,以确保您的对象模型一致。如果您将user.department设置为null,那么您还应该从department.users中删除用户。

我不明白上面的代码是做什么的,但删除了保存的调用,并维护了关联的两面,一切都会好的。