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 |