반응형
05-14 05:47
Today
Total
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
관리 메뉴

개발하는 고라니

[JPA] Cascade / OrphanRemoval 본문

Framework/JPA (Hibernate)

[JPA] Cascade / OrphanRemoval

조용한고라니 2021. 7. 25. 16:39
반응형

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

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔

www.inflearn.com

반응형

'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
Comments