- Today
- Total
개발하는 고라니
[JPA] Cascade / OrphanRemoval 본문
CASCADE (영속성 전이)
JPA에서 Cascade는 특정 엔티티를 persist() 해서 영속상태로 만들 때 연관된 엔티티들도 모두 영속상태로 만들기 위해 사용한다.
다음과 같이 Team과 Member 엔티티가 있다고 할 때, Team : Member = 1 : N이다. 즉 하나의 Team에 여러 Member가 있을 수 있다.
@Entity
@Data
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@ToString(exclude = "memberList")
public class Team {
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
//양방향 연관관계
@OneToMany(fetch = FetchType.LAZY, mappedBy = "team", cascade = CascadeType.ALL)
@Builder.Default
private List<Member> memberList = new ArrayList<>();
//편의메서드
public void addMember(Member member){
this.memberList.add(member);
member.setTeam(this);
}
}
@Entity
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@ToString(exclude = "team")
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "TEAM_ID")
private Team team;
}
Team team = Team.builder().name("A team").build();
Member memberA = Member.builder().name("user_a").build();
Member memberB = Member.builder().name("user_b").build();
team.addMember(memberA);
team.addMember(memberB);
em.persist(team);
tx.commit();
cascade = CascadeType.ALL로 설정을 해두어서 team에 memberA와 memberB를 추가하고 persist() 하면 team만 영속화하면 memberA와 memberB도 영속화 된다.
Cascade 종류
- ALL
- PERSIST - 연관된 엔티티 영속화
- REMOVE - 연관된 엔티티 삭제(비영속)
- MERGE
- REFRESH
- DETACH
Cascade 언제 사용하나?
- 자식 Entity가 하나의 부모 Entity 즉, 하나의 연관관계에 의해서만 관리될 때 사용하도록 하자.
- 단일 엔티티에 종속적일 때
- Life cycle이 동일(유사)할 때
Reply는 Member와 Board를 부모엔티티로 갖기 때문에 위와 같은 관계에서는 Cascade를 사용하면 안된다.
고아 객체
※ 고아 객체란 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 말한다.
사용법은 어노테이션 속성값에 orphanRemoval = true 를 주면 되는데, 다음 두 어노테이션에서만 사용이 가능하다. 이것을 사용하면 자식 엔티티를 부모 엔티티에서 지울 시 DELETE 쿼리가 나간다.
(CascadeType.REMOVE는 부모 엔티티를 제거할 때 자식 엔티티도 함께 제거되는 것 이므로 혼동하지 말자.
참고로 부모를 제거할 시 자식은 고아 객체가 되므로 자식도 함께 제거된다. 이는 CascadeType.REMOVE와 유사하게 동작함.)
@OneToOne(orphanRemoval = true)
@ManyToOne(orphanRemoval = true)
//위 어노테이션에서만 사용 가능
# Reference
'Framework > JPA (Hibernate)' 카테고리의 다른 글
[JPA] 벌크 연산 (Bulk Operation) (0) | 2021.08.05 |
---|---|
[JPA] 페치 조인 (FETCH JOIN) (0) | 2021.08.05 |
[JPA] Proxy (0) | 2021.07.23 |
[JPA] 상속관계 매핑 (0) | 2021.07.23 |
[JPA] JPA란? (0) | 2021.07.15 |