본문 바로가기
Computer Science/Spring & Java

[JPA] 영속성전이 & 고아객체

by 콩순이냉장고 2022. 11. 21.

영속성 전이: CASCADE

• 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들도 싶을 때

• 예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장

 

 

@Entity
public class Parent {
	@Id @GeneratedValue
    private Long id;
    @OneToMany(mappedBy = "parent")
    private List<Child> children = new ArrayList<Child>();
    ...
 }
 
 @Entity
 public class Child{
 	@Id @GeneratedValue
    private Long id;
    @ManyToOne
    private Parent parent;
    ...
}

와같은 엔티티가 있을때

 

부모자식을 저장한다면

Parent parent = new Parent();
em.persist(parent);

//1번자식 저장
Child child1 =new Child();
child1.setParent(parent);
parent.getChildren().add(child1);
em.persist(child1);

//2번자식 저장
Child child2 =new Child();
child2.setParent(parent);
parent.getChildren().add(child2);
em.persist(child2);

 

와같이 저장이된다 JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 함

따라서 부모 엔티티를 영속 상태로 만들고 자식 엔티티도 각각 영속 상태로 만듦

 

 

영속성 전이 : 저장

 

@Entity
public class Parent {
	@Id @GeneratedValue
    private Long id;
    @OneToMany(mappedBy = "parent",CascadeType.PERSIST)
    private List<Child> children = new ArrayList<Child>();
    ...
 }

cascade = CascadeType.PERSIST 옵션을 설정을 하면

 


Parent parent = new Parent();

Child child1 =new Child();
Child child2 =new Child();
child1.setParent(parent); // 연관관계추가
child2.setParent(parent); //연관관계 추가
parent.getChildren().add(child1);
parent.getChildren().add(child2);

//부모 저장, 연관된 자식들 저장
em.persist(parent);

 

 

 

영속성 전이: CASCADE - 주의!

• 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없음

• 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함 을 제공할 뿐

 

CASCADE의 종류

• ALL: 모두 적용

• PERSIST: 영속

• REMOVE: 삭제

• MERGE: 병합

• REFRESH: REFRESH

• DETACH: DETACH

 

 

고아 객체

JPA는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능을 제공 이것을 고아 객체(ORPHAN) 제거라 함 이기능을 사용하면 부모 엔티티의 컬렉션에서 자식 엔티티의 참조만 제거하면 자식 엔티티가 자동으로 삭제됨

 

@Entity
public class Parent {
	@Id @GeneratedValue
    private Long id;
    @OneToMany(mappedBy = "parent",orphanRemoval = true)
    private List<Child> children = new ArrayList<Child>();
    ...
 }
Parent parent1 = em.find(Parent.class, id);
parent1.getChildren().remove(0);//자식엔티티를 컬렉션에서 제거

 

실행 SQL

DELETE DROM CHILD WHERE ID=?

고아 객체 - 주의

• 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능

• 참조하는 곳이 하나일 때 사용해야함!

• 특정 엔티티가 개인 소유할 때 사용

• @OneToOne, @OneToMany만 가능

• 참고: 개념적으로 부모를 제거하면 자식은 고아가 된다. 따라서 고 아 객체 제거 기능을 활성화 하면, 부모를 제거할 때 자식도 함께 제거된다. 이것은 CascadeType.REMOVE처럼 동작한다.