JPA를 복습하면서 몇 가지 헷갈렸던 부분을 정리해보려고 한다.
영속성 전이는 엔티티의 상태 변경(영속화, 삭제 등)이 연관된 엔티티로 전이되는 것을 의미한다.
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되면 자식 엔티티도 삭제된다.
JPA에서는 객체의 연관관계를 테이블의 외래 키(FK)로 매핑한다.
연관관계의 주인은 이 외래 키를 관리하는 엔티티이다. 즉, 연관관계의 주인에서만 외래 키를 수정하거나 저장할 수 있다.
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;
}
CASCADE는 부모 엔티티에 수행된 작업을 자식 엔티티에도 전파하도록 설정한다.
CascadeType | 설명 |
---|---|
PERSIST | 부모 엔티티가 영속화될 때 자식 엔티티도 함께 영속화됨 |
MERGE | 부모 엔티티가 병합될 때 자식 엔티티도 함께 병합됨 |
REMOVE | 부모 엔티티가 삭제될 때 자식 엔티티도 함께 삭제됨 |
ALL | 모든 작업(PERSIST, MERGE, REMOVE 등)이 자식 엔티티로 전파됨 |
REFRESH | 부모 엔티티가 새로 고침될 때 자식 엔티티도 새로 고침됨 |
DETACH | 부모 엔티티가 준영속 상태가 될 때 자식 엔티티도 준영속 상태가 됨 |
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> children;
orphanRemoval = true는 부모 엔티티와의 관계가 끊어진 고아 객체를 자동으로 삭제하는 기능이다.
orphanRemoval은 CascadeType.REMOVE와 유사하지만, 부모와의 연관 관계가 끊어지는 경우에만 적용된다.
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> children;
특징 | CASCADE | orphanRemoval |
---|---|---|
주요 동작 | 부모 엔티티의 상태를 자식에게 전파 | 부모와의 관계가 끊어진 엔티티를 삭제 |
대상 | 특정 작업(PERSIST, REMOVE 등) | 연관 관계가 끊어진 엔티티 |
동시 사용 여부 | 가능 | 가능 |