2016년 11월 22일 화요일

[자바강의,스프링강의,JPA강의추천_탑크리에듀][JPA팁] @ManyToMany 설정, 삭제 작업 시 의도치 않은 테이블 정보가 삭제 될 때

[JPA팁] @ManyToMany 설정, 삭제 작업 시 의도치 않은 테이블 정보가 삭제 될 때-송석원

User 테이블과 Authority 테이블 n:m 관계이다.
이를 처리하기 위해 @ManyToMany 애노테이션을 사용하고 있다.

이에 따라 테이블 3개가 만들어진다.
User - User_Authority - Authority

증상
User 정보를 삭제 시 User, User_Authority 정보가 삭제된다. 이는 원하는 결과다.
그런데, 원하지 않는 Authority 정보도 삭제가 되고 있다. 이러면 큰 사고다.

원인
@ManyToMany 설저에 CascadeType.ALL을 설정하고 있다.
그에 따라 삭제시 캐스케이드 작업이 발생한다.
User --> User_Authority --> Authority 

해결
이를 CascadeType.PERSIST,CascadeType.MERGE 으로 변경한다.
정보의 수정은 사실 PERSIST로 충분하다. 지나친 설정은 피하자.
추가로, User, Authority 클래스 모두에 @JoinTable설정을 한다.

User
--------------------
@ManyToMany(fetch=FetchType.EAGER, cascade={CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name = "UserAuthority",
    joinColumns = @JoinColumn(name = "user_id"),
    inverseJoinColumns = @JoinColumn(name = "authority_id"))
private Set<Authority> authorities = new HashSet<>();

Authority 
--------------------
@ManyToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name = "UserAuthority",
    joinColumns = @JoinColumn(name = "authority_id"),
    inverseJoinColumns = @JoinColumn(name = "user_id"))
private Set<User> users = new HashSet<>();

결론
해결책은 비 연관관계 주인이었던 엔티티도 연관관계 주인으로 만드는 것이다.
캐스케이드 작동

댓글 없음:

댓글 쓰기