[JPA]고아 객체

@Entity
@Getter
@ToString
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @OneToMany(mappedBy = "parent", orphanRemoval = true, fetch = LAZY)
    @ToString.Exclude
    private List<Child> children = new ArrayList<>();
}
  • 테스트
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class SpringTest {
    
    @Autowired
    private EntityManager em;
    
    @Test
    public void test() {
        saveWithCascade(em);
        removeOrphan(em);
        findWithCascade(em);
    }
    private static void removeOrphan(EntityManager em) {
        Parent parent = em.find(Parent.class, 1L);
        
        parent
            .getChildren()
            .remove(0);
        
        em.flush();
    }
    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);
        em.flush();
    }
    private static void removeWithCascade(EntityManager em) {
        Parent parent = em.find(Parent.class, 1L);
        em.remove(parent);
        em.flush();
    }
    private static void findWithCascade(EntityManager em) {
        Parent parent = em.find(Parent.class, 1L);
        
        System.out.println(parent);
        
        parent
            .getChildren()
            .forEach(System.out::println);
    }
}
  • 고아 객체 제거 기능은
    • 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 JPA 기능
    • orphanRemoval 속성을 true 로 설정
     parent
            .getChildren()
            .remove(0);
  • 는 flush 수행시
delete 
    from
        child 
    where
        id=?

가 수행되게 된다.


Uploaded by N2T

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

[JPA] 값 타입- 임베디드 타입  (0) 2023.11.06
[JPA] 값 타입- 개요  (0) 2023.11.06
[JPA] EntityManager 에서 flush 의 역할  (0) 2023.11.04
[JPA]영속성 전이 :저장  (0) 2023.11.04
JPA 복합 키  (0) 2023.11.04