SPRING

[SPRING] JPA 영속성 전이

집한구석 2022. 6. 6. 15:34
728x90

영속성 전이

  • 특정 엔티티를 영속 상태로 만들 경우 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용
  • 예를 들자면 부모엔티티를 저장할 경우 자식엔티티도 함께 저장 (자식의 연관관계가 두개 이상인 경우 사용하면 안됨)

영속성 전이 옵션 

옵션 설명
CascadeType.ALL 모두 적용
CascadeType.PERSIST 영속
CascadeType.MERGE 병합
CascadeType.REMOVE 삭제
CascadeType.REFRESH 리프레쉬
CascadeType.DETACH DETACH
  • 실무에서는 보통 ALL / PERSIST / REMOVE 옵션을 사용

Persist 옵션

@Entity
@Getter
@Setter
public class Parent {

    @Id
    @GeneratedValue
    @Column(name = "parent_id")
    private Long id;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
    private List<Child> childs = new ArrayList<>();

    public void addChild(Child child) {
        this.childs.add(child);
        child.setParent(this);
    }
}

@Entity
@Getter
@Setter
public class Child {

    @Id
    @GeneratedValue
    @Column(name = "child_id")
    private Long id;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;

}
  • Parent가 Child를 관리가 가능하도록 Persist 옵션을 줌
Child child1 = new Child();
Child child2 = new Child();

Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);

entityManager.persist(parent);

entityTransaction.commit();

// Persist옵션이 없는 경우 아래처럼 호출해야함
// entityManager.persist(child1);
// entityManager.persist(child2);
// entityManager.persist(parent);
  • Parent가 저장되면서 Child도 같이 추가됨 
  • 해당 옵션만 추가한 상태에서 영속성컨텍스트를 초기화하고 Parent로 삭제할 경우 자식 삭제쿼리가 동작하지 않음 (Remove옵션으로 해결해야함)

Remove 옵션

  • 부모 엔티티를 삭제할때 연관되어 있는 자식엔티티를 같이 삭제

ALL 옵션

  • Persist + Remove 옵션 합친 옵션
  • 자식엔티티를 관리하는 부모 엔티티가 하나일 경우에만 사용해야하며, 라이프 사이클이 같을 경우 사용하는 것이 좋음