241211 TIL - JPA 복습 정리 (영속성 전이, 연관관계 주인과 mappedBy, CASCADE와 orphanRemoval)

J_log·2024년 12월 11일
0
post-thumbnail

JPA를 복습하면서 몇 가지 헷갈렸던 부분을 정리해보려고 한다.

1. 영속성 전이

영속성 전이는 엔티티의 상태 변경(영속화, 삭제 등)이 연관된 엔티티로 전이되는 것을 의미한다.
ex) 부모 엔티티를 저장하거나 삭제할 때 자식 엔티티도 함께 저장하거나 삭제해야 하는 경우.
이를 위해 JPA는 @OneToMany, @ManyToOne 등 관계 매핑 어노테이션에서 cascade 속성을 제공한다.

@Entity
public class Parent {
    @Id @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private List<Child> children = new ArrayList<>();
}

@Entity
public class Child {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    private Parent parent;
}

부모 엔티티가 persist되면 자식 엔티티도 함께 persist된다.
부모 엔티티가 remove되면 자식 엔티티도 삭제된다.

2. 연관관계의 주인과 mappedBy

연관관계 주인

JPA에서는 객체의 연관관계를 테이블의 외래 키(FK)로 매핑한다.
연관관계의 주인은 이 외래 키를 관리하는 엔티티이다. 즉, 연관관계의 주인에서만 외래 키를 수정하거나 저장할 수 있다.

mappedBy

mappedBy는 연관관계의 주인을 지정하는 속성이다.

  • 주인이 아닌 쪽에서 사용되며, '이 연관관계는 주인 엔티티의 어떤 필드에 의해 매핑되는지'를 나타낸다.
@Entity
public class Team {
    @Id @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "team") // 주인은 Member 클래스의 team 필드
    private List<Member> members = new ArrayList<>();
}

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = "team_id") // 외래 키 관리
    private Team team;
}
  • Team의 Members 필드는 mappedBy = "team"을 통해 Member의 team 필드에 의해 매핑됨을 의미한다.
  • 외래 키는 Member 엔티티에서 관리된다(@JoinColumn 설정)

3. CASCADE와 orphanRemoval

CASCADE

CASCADE는 부모 엔티티에 수행된 작업을 자식 엔티티에도 전파하도록 설정한다.

CascadeType설명
PERSIST부모 엔티티가 영속화될 때 자식 엔티티도 함께 영속화됨
MERGE부모 엔티티가 병합될 때 자식 엔티티도 함께 병합됨
REMOVE부모 엔티티가 삭제될 때 자식 엔티티도 함께 삭제됨
ALL모든 작업(PERSIST, MERGE, REMOVE 등)이 자식 엔티티로 전파됨
REFRESH부모 엔티티가 새로 고침될 때 자식 엔티티도 새로 고침됨
DETACH부모 엔티티가 준영속 상태가 될 때 자식 엔티티도 준영속 상태가 됨
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> children;

orphanRemoval

orphanRemoval = true는 부모 엔티티와의 관계가 끊어진 고아 객체를 자동으로 삭제하는 기능이다.
orphanRemoval은 CascadeType.REMOVE와 유사하지만, 부모와의 연관 관계가 끊어지는 경우에만 적용된다.

@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> children;
  • 부모 엔티티에서 자식 엔티티를 컬렉션에서 제거하면 데이터베이스에서도 삭제된다.
특징CASCADEorphanRemoval
주요 동작부모 엔티티의 상태를 자식에게 전파부모와의 관계가 끊어진 엔티티를 삭제
대상특정 작업(PERSIST, REMOVE 등)연관 관계가 끊어진 엔티티
동시 사용 여부가능가능

0개의 댓글