🟩 영속성 전이 (Transtive Persistence)
- 특정 엔티티를 영속 상태로 만드는 동시에 연관된 엔티티도 영속 상태로 만들고 싶을 때 "영속성 전이 기능"을 사용한다.
01. 영속성 전이 옵션 없이 부모 엔티티와 자식 엔티티를 저장하는 예시
부모, 자식 매핑 코드
@Entity
public class Parent {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "parent")
private List<Child> children = new ArrayList<>();
}
@Entity
public class Child {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private Parent parent;
}
부모와 자식을 각각 저장하는 코드
- 부모와 자식을 각각 영속화해야 한다.
Parent parent = new Parent();
em.persist(parent);
Child child1 = new Child();
child1.setParent(parent);
parent.getChildren().add(child1);
em.persist(child1);
Child child2 = new Child();
child2.setParent(parent);
parent.getChildren().add(child2);
em.persist(child2);
02. 영속성 전이 : 저장 (CascadeType.PERSIST)
부모, 자식 매핑 코드
- @OneToMany에 cascade 옵션을 PERSIST로 둔다.
@Entity
public class Parent {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
private List<Child> children = new ArrayList<>();
}
@Entity
public class Child {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private Parent parent;
}
자식을 포함한 부모를 영속화 시키면 부모, 자식 둘 다 저장된다.
- 영속성 전이 옵션을 활성화 시킨다.
- 부모를 영속화하면 연관된 자식들도 같이 영속화된다.
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
child1.setParent(parent);
child2.setParent(parent);
parent.getChildern().add(child1);
parent.getChildern().add(child2);
// 부모와 연관된 자식도 같이 저장한다.
em.persist(parent);
03. 영속성 전이 : 삭제 (CascadeType.REMOVE)
부모, 자식 매핑 코드
- @OneToMany에 cascade 옵션을 REMOVE로 둔다.
@Entity
public class Parent {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE)
private List<Child> children = new ArrayList<>();
}
@Entity
public class Child {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private Parent parent;
}
자식을 포함한 부모를 삭제하면 연관된 자식들도 삭제된다.
- CascadeType.REMOVE 옵션으로 인해 부모와 연관된 자식들도 같이 삭제한다.
Parent parent = em.find(Parent.class, 1L);
// CascadeType.REMOVE 옵션으로 인해 부모와 연관된 자식들도 같이 삭제한다.
em.remove(parent)
🟩 고아 객체 (ORPHAN)
- 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제한다.
- 부모 엔티티의 컬렉션에 자식 엔티티의 참조를 제거해도 자동으로 삭제되게 할 수 있다.
@Entity
public class Parent {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "parent", orphanRemoval = true)
private List<Child> children = new ArrayList<>();
}
@Entity
public class Child {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private Parent parent;
}
01. 부모 엔티티의 컬렉션에서 자식 엔티티의 참조를 제거하면 자식 엔티티가 삭제된다.
Parent parent = em.find(Parent.class, 1L);
// 인덱스 0인 자식을 삭제한다.
parent.getChildren().remove(0);
DELETE FROM child WHERE id = ?
02. 부모를 제거할 경우 자식들도 같이 삭제된다.
// 부모가 삭제되면 자식들은 고아가 되어 자식들도 같이 삭제한다.
em.remove(parent);
🔗 참고
자바 ORM 표준 JPA 프로그래밍 - YES24
자바 ORM 표준 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스의 차이도 중간에서 해결해준다. 이 책은 JPA 기초 이론과 핵심 원리, 그리고
www.yes24.com