2012-05-28 4 views
1

두 개의 엔터티 사용자 및 부서가 있습니다. 두 엔터티 (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 최대 절전 모드는 선택에서 데이터를 채 웁니다 여전히 분리 된 사용자를 포함하기 때문에 이는 사용자에 대한 변경 사항이 실제로 데이터베이스로 플러시되기 전에 발생합니다. 여기에서 가장 좋은 방법은,

  • 내가 부서를 저장하기 전에 (그리고 부서를 절약 트랜잭션이 롤백됩니다 실패 할 경우) 호출자에게 반환하기 전에
  • 내가 savedInstance를 새로해야 플러시해야
  • 다른 아이디어.
+0

옵션이 정상적으로 작동하며 성능이 저하되지 않습니다. –

답변

2

첨부 된 엔티티를 사용하기 때문에 아무 것도 저장할 필요가 없습니다. JPA는 첨부 된 항목에 대한 변경 사항을 자동으로 유지합니다.

양방향 연관이있는 경우 개체 모델의 일관성을 유지하기 위해 양쪽에서 변경하는 것은 사용자의 책임입니다. user.department을 null로 설정하면 department.users에서 사용자를 삭제해야합니다.

나는 위의 코드가 무엇을하는지 이해하지 못하지만, 저장을위한 호출을 제거하고, 연결의 양면을 유지하며 모든 것이 잘 될 것이다.