<aside> ❗

영속성 전이 - CASECADE

image.png

@OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)

image.png

@Entity
public class Parent {
    @Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    private String name;

		// parent를 persist()할 때, 컬렉션 안에 있는 모든 얘들을 persist() 할거야
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private List<Child> childList = new ArrayList<>();

    public void addChild(Child child) {
        childList.add(child);
        child.setParent(this);
    }
}
Child child1 = new Child();
Child child2 = new Child();

Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);

em.persist(parent);
// parent만 persist() 해줬는데 childe 둘 모두 persist()됨

주의사항

<aside> ❗

CASCADE의 종류



<aside> ❗

고아 객체

// 자식 엔티티를 컬렉션에서 제거 -> 해당 자식 튜플에 대한 DELETE 쿼리가 나감 
Parent parent 1 = em.find(Parent.class, id);
parent1.getChildren().remove(0);
Child child1 = new Child();
Child child2 = new Child();

Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);

em.persist(parent);

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

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

</aside>

<aside> ❗

고아 객체 주의

[참고]

<aside> ❗

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

@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Child> childList = new ArrayList<>();
em.persist(parent); // parent를 생성하면 컬렉션에 들어간 child가 자동으로 DB 저장됨
parent.getChildeList().remove(0); // 자동으로 DB에서 제거됨 

<aside> ❗

글로벌 페치 전략 설정