[JPA]영속성 전이 :저장

package com.example.springboot3.test;

import jakarta.persistence.*;
import lombok.Getter;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @OneToMany(mappedBy = "parent", cascade = jakarta.persistence.CascadeType.PERSIST)
    private List<Child> children = new ArrayList<>();
}
@Getter
@Setter
@Entity
@Table(name = "child")
public class Child {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;
    
    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;
}
  • 테스트
package com.example.springboot3.test;

import jakarta.persistence.EntityManager;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

/**
 * packageName    : com.example.springboot3.test
 * fileName       : SpringTest
 * author         : ipeac
 * date           : 2023-11-04
 * description    :
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2023-11-04        ipeac       최초 생성
 */
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) // 설정된 DB 사용
public class SpringTest {
    
    @Autowired
    private EntityManager em;
    
    @Test
    public void test() {
        saveWithCascade(em);
    }
    private static void saveWithCascade(EntityManager em) {
        Parent parent = new Parent();
        Child child1 = new Child();
        child1.setParent(parent);
        Child child2 = new Child();
        child2.setParent(parent);
        
        parent
            .getChildren()
            .add(child1);
        parent
            .getChildren()
            .add(child2);
        
        em.persist(parent);
    }
}
  • 부모 엔티티를 저장하는 경우 연관된 자식의 엔티티들도 함께 영속 상태로 만들고 싶은 경우
    • 영속성 전이 (Cascade) 기능을 사용가능
  • CascadeType 을 통해 영속성 전이 가능
  • 부모 엔티티에 영속성 전이 옵션 사용시 부모 엔티티를 저장할때 연관된 자식도 자동으로 함께 저장된다.
  • 수행되는 쿼리 (아래)
Hibernate: 
    insert 
    into
        parent
        
    values
        ( )

--
Hibernate: 
    insert 
    into
        child
        (parent_id) 
    values
        (?)
--

Hibernate: 
    insert 
    into
        child
        (parent_id) 
    values
        (?)

주의

  • LAZY 로딩
    • CacadeType 와 지연로딩을 같이 사용하는 경우
    • 영속성 전이가 일어나는 경우 관련 엔티티가 실제로 필요시까지 로딩되지 않을 수 있음.


Uploaded by N2T

'자바 > JPA' 카테고리의 다른 글

[JPA]고아 객체  (0) 2023.11.04
[JPA] EntityManager 에서 flush 의 역할  (0) 2023.11.04
JPA 복합 키  (0) 2023.11.04
[JPA] 즉시 로딩과 조인 전략  (0) 2023.11.04
[JPA] 프록시 객체의 초기화  (0) 2023.11.04