Post

[JPA] 고아객체

고아 객체

고아 객체?


  • 부모 엔티티와 관계가 끊어진 자식 엔티티
1
2
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> childList = new ArrayList<>();
  • orphanRemoval를 true로 주면 저 객체가 사라지면 db에서도 delete됨.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Child child = new Child();
Child child2 = new Child();

Parent parent = new Parent();

parent.addChild(child);
parent.addChild(child2);

em.persist(parent);

em.flush();
em.clear();

Parent findParent = em.find(Parent.class, parent.getId());
findParent.getChildList().remove(0);

---

/* delete hellojpa.Child */ delete
        from
            Child
        where
            id=?

고아 객체 - 주의


  • 참조가 되지 않는 것은 아예 db에서 지워버리기 때문에 조심해야 함.
  • 참조하는 곳이 하나일 때 사용해야 겠죠?
  • 부모를 제거하면 자식도 제거됨( = CascadeType.REMOVE, ALL)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Parent findParent = em.find(Parent.class, parent.getId());
findParent.getChildList().clear();

---

Hibernate:
    /* delete hellojpa.Child */ delete
        from
            Child
        where
            id=?
Hibernate:
    /* delete hellojpa.Child */ delete
        from
            Child
        where
            id=?
  • OneToOne, ManyToOne에서만 가능!

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


  • CascadeType.ALL 과 orphanRemoval = true를 같이쓰면? → 자식 객체의 생명 주기를 부모 객체에서 관리가 가능하다!
  • 도메인 주도 설계(DDD) 구현할 때 유용!
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.