Open berryberrybin opened 1 year ago
CascadeType.REMOVE
orphanRemoval = true
CascadeType.All
CascadeType.REMOVE
와 CascadeType.PERSIST
를 함께 사용한 것과 동일한 효과를 가짐주의사항
Team은 @OneToMany, Member는 @ManyToOne으로 양방향 매핑
/ Team.java
@Entity
public class Team {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "team", fetch = FetchType.LAZY)
private List<Member> members = new ArrayList<>();
public Team() {
}
public void addMember(Member member) {
members.add(member);
member.setTeam(this);
}
}
// Member.java @Entity public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn
private Team team;
public Member() {
}
}
### CascadeType.Remove로 변경하여 test할 경우
- (1) 부모 엔티티 삭제하는 경우
- delete 쿼리가 3번 나감
- 즉, Team(부모)가 삭제될때 Member(자식)도 영속성 전이 옵션으로 인해 함께 삭제됨
- (2) 부모 엔티티에서 자식 엔티티를 제거하는 경우
- delete쿼리가 전혀 나가지 않음
- 영속성 전이 삭제 옵션은 부모와 자식의 관계가 끊어졌다 해서 자식을 삭제하지 않기 때문
```java
// Team.java에서 CascadeType.All 옵션 추가
@OneToMany(
mappedBy = "team",
fetch = FetchType.LAZY,
cascade = CascadeType.ALL // { CascadeType.PERSIST, CascadeType.REMOVE }와 동일하다.
)
private List<Member> members = new ArrayList<>();
// 부모 엔티티 삭제하는 경우 test
@Test
void cascadeType_Remove_InCaseOfTeamRemoval() {
// given
Member member1 = new Member();
Member member2 = new Member();
Team team = new Team();
team.addMember(member1);
team.addMember(member2);
teamRepository.save(team);
// when = 부모 엔티티를 삭제하는 경우, delete쿼리 3번 나감
teamRepository.delete(team);
// then
List<Team> teams = teamRepository.findAll();
List<Member> members = memberRepository.findAll();
assertThat(teams).hasSize(0);
assertThat(members).hasSize(0);
}
// when - 부모 엔티티에서 자식 엔티티를 제거하는 경우 test, delete쿼리가 전혀 나가지 않음
team.getMembers().remove(0);
// Team.java에서 CascadeType.PERSIST와 orphanRemoval=true 옵션 추가
@OneToMany(
mappedBy = "team",
fetch = FetchType.LAZY,
cascade = CascadeType.PERSIST,
orphanRemoval = true
)
private List<Member> members = new ArrayList<>();
// when - 부모 엔티티를 삭제하는 경우, delete쿼리 3번 나감
teamRepository.delete(team);
// when -부모 엔티티에서 자식 엔티티를 제거하는 경우 test, delete쿼리가 1개 나감
team.getMembers().remove(0);