2016-07-21 5 views
0

사용자에게 특정 역할을 제거하는 방법을 모르기 때문에 문제가 있습니다. 이 문제는 Permission 클래스에서 단방향 관계로 연결됩니다. 다음은 관련 코드 조각입니다.단방향 관계로 엔티티 제거 @ManyToOne (JPA)

클래스 사람

@Entity 
public class User { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long userId; 

@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="user") 
private Collection<Role> roles; 

클래스 역할

@Entity 
public class Role { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long roleId; 

@ManyToOne(fetch=FetchType.LAZY) 
private User user; 

나는이 방법

user.getRoles().remove(roleToRemove) 
entityManger.merge(user) 

roleToRemove이 datebase에서 컬렉션에서 삭제되었지만되지 않았습니다에서 사용자의 특정 역할을 제거하기 위해 노력했다.

그래서, 내가

orphanRemoval = true 

을 추가 그리고 현재 내가 권한 클래스에서 발생하는 단방향 관계에 문제가 (나는 완료되었습니다 테스트를 썼다). 나는 제거하고자하는 idRole이 Permission 테이블에 존재하기 때문에 DatabaseExepction을받습니다.

@Entity 
public class Permission { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long permissionId; 

@ManyToOne(fetch=FetchType.LAZY) 
private Role role; 

제 질문은이 문제를 어떻게 관리 할 것인가입니다.

답변

0

안녕하세요 사용자는 사용자 - 역할 관계의 소유자가 아닙니다. 관계를 유지하려면 관계의 소유 끝을 갱신해야합니다.

user.getRoles().remove(roleToRemove) 
roleToRemove.setUser(null) 
entityManger.merge(user) 

내 생각에 고아 제거가 필요하지 않습니다.

-1

이것은 단방향이 아니며 양방향 관계입니다. 데이터베이스를 반영하기 위해 오브젝트 모델에 대한 사용자 - 역할 관계의 양면을 유지 보수해야합니다. 좋은 연습 일 뿐이며 코드에서 모든 관계의 양면을 관리하게하려면 이러한 문제를 피하십시오. 이미 사용자의 역할 컬렉션에서 역할을 제거하고 있으므로 역할의 사용자 참조를 무효화하고 사용자와 역할을 병합해야합니다.

소유 측면에서 데이터베이스의 외래 키를 제어하므로 역할 행에 영향을주는 업데이트 문은 1 개만 발생하지만 개체 모델은 데이터베이스와 동기화되어 캐시가 동기화되지 않도록 방지합니다.

+0

"답변"에서 "관계 소유자"와 "양측의 관계 업데이트"를 처리했음을 확인 했습니까? 자세한 내용이 필요하다고 생각하면 내 대답에 게시해야합니다. 쓰기 스타일을 개선하여 앵무새 게임을하면 좋은 맛을 시연하는 것이 아닙니다. –

+0

스타일과 취향은 보는 사람의 눈에 있지만 역할이 병합되어야한다고 언급하지 않았기 때문에 대답은 반만 맞습니다. 비슷한 문제가 발생할 가능성이있는 사람들에게 완벽하고 유용하게 사용하려면 답변을 추가 정보로 자유롭게 업데이트하십시오. 그렇지 않으면 OP가 '최상의'답변을 결정할 수 있습니다. 결국 이러한 사이트에서 여러 답변을 허용하는 것입니다. – Chris

+0

글쎄 그건 끔찍한 망상이다. 양쪽에서 병합하는 것은 100 % 불필요합니다. http://stackoverflow.com/questions/20068742/jpa-updating-bidirectional-association 나는 당신이 내 눈을 여는 것에 대해 지금 하나의 표를 주어야한다고 생각한다. :) –