JPA 영속성 전이,고아객체

떡ol·2023년 4월 23일
0

JPA Entity를 DB저장 및 삭제를 할때 연관된 객체도 함께 작업해주는 편의기능이 있습니다.
이를 영속성 전이 cascade라고 합니다.

CASCADE 사용하기

cascade에는 6가지 방법이 있습니다. 아래 3가지를 그나마(?) 자주 사용합니다.
• ALL: 모두 적용
• PERSIST: 영속
• REMOVE: 삭제

• MERGE: 병합
• REFRESH: REFRESH
• DETACH: DETACH

사용법은 아래와 같습니다.

@Entity
public class Member {
    @Id    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name ="MEMBER_ID")
    private Long id;
    @OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
    private List<Order> orders = new ArrayList<>();
}
   // main
   Order order1 = new Order();
   Order order2 = new Order();
   Member member = new Member();
   member.getOrders().add(order1);
   member.getOrders().add(order2);
   em.persist(member); // persist는 member만 했지만 위에 order 두개가 들어가진다.

고아 객체 (orphanRemoval)

이것 역시 객체를 관리하기 편리하게하는 옵션입니다.
부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제합니다.

@Entity
public class Member {
    @Id    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name ="MEMBER_ID")
    private Long id;
    @OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true) // 추가해줍니다.
    private List<Order> orders = new ArrayList<>();
}
	// main
	Order order1 = new Order();
	Order order2 = new Order();
	Member member = new Member();
    member.setName("Kim");
    member.getOrders().add(order1); // 연관관계를 잡아주는 method가 있으면 두번 선언할 필요 없습니다.(1)
    order1.setMember(member); // 연관관계를 잡아주는 method가 있으면 두번 선언할 필요 없습니다.(2)
    member.getOrders().add(order2);
    order2.setMember(member);
    em.persist(member);

	em.flush();
	em.clear();
	Member findMem = em.find(Member.class,member.getId());
 	findMem.getOrders().remove(0);
   // 리스트에서 제거하면 member와는 상관없게되고 그 즉시 삭제 쿼리가 실행됩니다.

여기서는 더 다룰게 없으므로 글을 마칩니다.

profile
하이

0개의 댓글