-
-
안녕하세요? 오늘은 JPA CASCADE 영속성 전이와 고아 객체 에 대해서 알아보도록 하겠습니다.
-
영속성 전이
(CASCADE)
: 연관관계랑은 전혀 상관이 없다. : 단일 소유자로써 ★★★ 부모 엔티티의 데이터를 등록할 때, 연관관계가 설정된 자식 엔티티의 정보를 일괄 등록하는 기능 > 부모가 하나일 때에만 사용 가능 >> 단일 엔테티에 종속적일때 사용 ★★★ >>> 타 엔티티와의 영향도 고려 필수 ★★★ |
부모 엔티티 생성)
@Entity
public class Parent {
@Id @GeneratedValue
@Column(name = "PARENT_ID")
private Long id;
@Column(name = "PARENT_NAME")
private String name;
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) // ★★★
private List<Child> childList = new ArrayList<>();
public void addChild(Child child) {
childList.add(child);
child.setParent(this);
}
...
}
자식 엔티티 생성)
@Entity
public class Child {
@Id @GeneratedValue
@Column(name = "CHILD_ID")
private Long id;
@Column(name = "CHILD_NAME")
private String name;
@ManyToOne
@JoinColumn(name = "CHILD_ID")
private Parent parent;
...
}
샘플코드)
EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Parent parent = new Parent();
parent.setName("parentA");
Child child1 = new Child();
child1.setName("childA");
Child child2 = new Child();
child1.setName("childB");
// cascade 미사용시
em.persist(parent);
em.persist(child1);
em.persist(child2);
// cascade 사용시
em.persist(parent);
tx.commit();
+
cascade를 사용 시, parent 엔티티에 데이터를 등록하게 되면, 연관관계를 맺은 모든 child 엔티티에 데이터가 자동 등록이 되게 된다.
-
CASCADE의 종류
속성 명 | 설명 |
ALL | 모두 적용 |
PERSIST | 영속 (저장시에만 사용) |
REMOVE | 삭제 |
MERGE | 병합 |
REFRESH | 새로고침 |
DETACH | 영속성 해제 |
-
고아 객체
: 부모 엔티티와 연관관계가 끊어진, 자식 엔티티를 자동으로 삭제 : 참조가 제거된 엔티티는, 다른 곳에서 참조하지 않는 고아 객체로 판단하고 삭제하는 기능 : 참조하는 곳이 하나일 때 사용 ★★★ : 특정 엔티티가 개인 소유할 떄 사용 ★★★ : 일대일 [1:1], 일대다 [1:N] 연관관계에서만 사용가능 + 개념적으로 부모를 제거하면, 자식은 고아가 된다. > 고아 객체 제거 기능을 활성화하면, 부모를 제거할 때, 자식도 함께 제거된다. >> CascadeType.REMOVE 처럼 작동 |
부모 엔티티 생성)
@Entity
public class Parent {
@Id @GeneratedValue
@Column(name = "PARENT_ID")
private Long id;
@Column(name = "PARENT_NAME")
private String name;
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true) // ★★★
private List<Child> childList = new ArrayList<>();
public void addChild(Child child) {
childList.add(child);
child.setParent(this);
}
...
}
자식 엔티티 생성)
@Entity
public class Child {
@Id @GeneratedValue
@Column(name = "CHILD_ID")
private Long id;
@Column(name = "CHILD_NAME")
private String name;
@ManyToOne
@JoinColumn(name = "CHILD_ID")
private Parent parent;
...
}
샘플코드)
EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Parent parent = new Parent();
parent.setName("parentA");
Child child1 = new Child();
child1.setName("childA");
Child child2 = new Child();
child1.setName("childB");
em.persist(parent);
em.flush();
em.clear();
Parent findParent = em.find(Parent.class, parent.getId());
findParent.getChildList().remove( index: 0 );
tx.commit();
※ 다시한번 말하지만, 해당 기능들은, 단일 엔테티에 종속적일때 사용 ★★★
-> 특정엔티티가 개인소유할 시에만 사용!!!
-
영속성 전이 + 고아 객체의 생명주기
: 스스로 생명주기를 관리하는 엔티티는, persist로 영속화하고, remove로 제거한다. : 두 옵션을 모두 활성화 하면, 부모 엔티티를 통해서 자식의 생명주기 관리 가능 ※ 도메인 주도 설계(DDD)의 Aggregate Root 개념 구현 시 유용 |
+
위의 샘플 코드를 예로들면,
parent가 해당 기능의 생명주기를 관리하는 셈
오늘은 JPA 영속성 전이 CASCADE 와 고아 객체 에 대해서 알아보았습니다.
그럼 오늘도 즐거운 하루 되시길 바라겠습니다.
※ 참고
https://logger-debug.tistory.com/entry/JPA-%EC%98%81%EC%86%8D%EC%84%B1-Flush
'프로그래밍 > Back-end' 카테고리의 다른 글
JPA 쿼리 JPQL 페이징 조인 서브쿼리 (0) | 2024.10.18 |
---|---|
JPA QueryDSL 네이티브SQL JDBC MyBatis (0) | 2024.10.18 |
JPA 지연로딩 즉시로딩 (0) | 2024.10.17 |
JPA 지연로딩 즉시로딩 프록시 proxy (0) | 2024.10.17 |
JPA 영속성 영속상태와 준영속상태 (0) | 2024.10.15 |
JPA 영속성 Flush (0) | 2024.10.15 |
JPA 영속성 컨텍스트의 장점에 대하여! (0) | 2024.10.15 |
JPA 영속성과 영속성 컨텍스트에 대하여! (0) | 2024.10.15 |