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개의 댓글

Powered by GraphCDN, the GraphQL CDN