반응형
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶으면 영속성 전이 기능을 사용하면 된다. 쉽게 말해서 영속성 전이를 사용하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다.
JPA는 CASCADE 옵션으로 영속성 전이를 제공한다.
@Entity
@NoArgsConstructor
public class Parent {
@Id
...
@OneToMany(mappedBy = "parent", cascade = {CascadeType.PERSIST , CascadeType.REMOVE}) // 영속성 전이
private List<Child> childrens = new ArrayList<Child>();
public void addChild(Child child) { // Child 추가
this.childrens.add(child);
}
public void removeChild(Child child) { // Child 삭제
this.childrens.remove(child);
}
}
@Entity
@NoArgsConstructor
public class Child {
@Id
...
@ManyToOne
private Parent parent;
}
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
// 영속성 전이 저장 코드
parent.addChild(child1);
parent.addChild(child2);
// 영속성 전이 삭제 코드
parent.removeChild(child2);
나의 같은 경우는 Setter는 절대 만들지 않고 도메인 내에 도매인 로직을 만들어 해당 로직만을 사용해서 데이터가 추가되고 변경되게끔 구축한다. 도메인만 봐도 어떤 기능들이 있는지 확인할 수 있어서 알아보기 쉽고 추적이 가능하다.
하지만 연관관계가 많을때는 각자 관리하는게 유지보수에 더 유리하다.
연관관계가 복잡하지 않은 구조에서만 사용하고 있다.
CascadeType Enum을 알아보자
- ALL : 모두 적용
- PERSIST : 하위 엔티티까지 영속성을 유지
- MERGE : 하위 엔티티까지 병합 작업을 지속
- REMOVE : 하위 엔티티까지 제거 작업을 지속
- REFRESH : 하위 엔티티까지 인스턴스 값을 새로고침(데이터베이스)
- DETACH : 영속성 컨텍스트에서 엔티티 제거
public enum CascadeType {
/** Cascade all operations */
ALL,
/** Cascade persist operation */
PERSIST,
/** Cascade merge operation */
MERGE,
/** Cascade remove operation */
REMOVE,
/** Cascade refresh operation */
REFRESH,
/**
* Cascade detach operation
*
* @since 2.0
*
*/
DETACH
}
Cascade는 도메인끼리 라이프사이클이 같고 구조가 완전히 구축된 상태에서 사용해야 한다.
그렇지 않으면 관리가 너무 어렵고 참조하던 다른 도메인에서 문제가 많이 생길 수 있다.
만약 꼭 써야한다면 ALL은 사용하지 않는것을 추천한다.
도메인 로직에서 실수로 변하지 않아야 하는 데이터를 변경시키거나 연관된 객체에서 오류가 많이 나올 수 있다.
꼭 필요한 타입만 설정해서 사용하도록 하자.
반응형
'JPA' 카테고리의 다른 글
엔티티(Entity)와 값 타입(Value Type) (2) | 2022.01.13 |
---|---|
고아 객체 제거: orphanRemoval (0) | 2022.01.11 |
프록시를 사용한 즉시(Eager), 지연(Lazy) 로딩 매핑 (0) | 2022.01.06 |
조인 테이블 매핑 (0) | 2022.01.05 |
복합 키와 식별, 비식별 관계 매핑 (0) | 2022.01.04 |