JPA

영속성 전이와 고아객체

유휴 2022. 12. 4. 17:54

강의참고 - 자바 ORM 표준 JPA 프로그래밍 - 기본편

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

목표

- 영속성 전이와 고아객체에 대해서 알아본다.

 

영속성 전이란?

- 특정 엔티티를 영속상태로 만들 때 연관된 엔티티도 함께 영속상태로 만드는 기능 ex) 부모 엔티티를 저장 할 때 자식 엔티티를 함께 저장

- 연관관계를 매핑하는 것과는 아무 관련이 없으며, 엔티티를 영속화 할 때 연관된 엔티티를 함께 영속화하는 편리함을 제공할 뿐이다.

@Entity
public class Board {

    @Id
    @generatedValue
    private Long id;

    @OneToMany(mappedBy = "board", cascade=CascadeType.PERSIST) //영속성 전이 : 저장 설정
    private BoardItem boardItem;
}

 

CASCADE의 종류

- ALL: 모두 적용

- PERSIST : 영속

- REMOVE : 삭제

- MERGE : 병합

- REFRESH : REFRESH

- DETACH : DETACH

 

 

고아 객체란?

부모 엔티티와 연관관계가 끊어진 자식 엔티티를 말한다.

 

고아객체 제거

- JPA에서는 고아객체를 자동으로 제거해주는 기능을 제공한다. orphanRemoval = true

- 참조가 제거된 엔티티를 다른 곳에서 참조하지 않는 고아객체로 보고 삭제하는 기능으로써 참조하는 곳이 하나 인 경우에만 사용해야한다.

- @OneToOne, @OneToMany 인 경우에만 사용 가능하다.

- 고아 객체 제거 기능을 활성화 하는경우 CascadeType.REMOVE처럼 부모 엔티티를 제거 할때  자식 엔티티도 함께 제거된다.

 

고아객체제거 구현코드

@Entity 
public class Board {

    @Id
    @generatedValue
    private Long id;
    
    @Column(name="BOARDNAME") 
    prviate String name;
    
    @OneToMany(mappedBy = "board", orphanRemoval=true) //고아객체제거 설정
    private BoardItem boardItem;
}

public class Test {
	
    public void orphanRemovalTest(){
    	Board board = em.find(Board.class, 1L);
        board.getChildren().remove(0); //자식 엔티티를 컬렉션에서 제거하는 시점에 자식엔티티 delete sql 실행
    }
}

 

영속성 전이 + 고아 객체, 생명주기

- 스스로 생명주기를 관리하는 엔티티는 em.persist()로 영속, em.remove()로 제거한다.

- 하지만 두 옵션을 모두 활성화 하면 부모 엔티티를 통해서 자식의 생명주기를 관리 할 수 있다.

구현코드

@Entity 
public class Board {

    @Id
    @generatedValue
    private Long id;

    //영속성 전이와 고아객체제거 모두 설정
    @OneToMany(mappedBy = "board", cascade=CascadeType.ALL, orphanRemovel=true) 
    private BoardItem boardItem;
}