2012-05-28 123 views
1

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

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返回给调用者之前刷新
  • 任何其他的想法。
+0

选项工作正常,我猜没有性能影响。 –

回答

2

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

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

我不明白上面的代码是做什么的,但删除调用来保存,并维护协会的双方,一切都会好起来。