JPA - 영속성 전이

Sungjin·2021년 7월 14일
0

JPA

목록 보기
9/10
post-thumbnail

영속성 전이 CASCADE

  • 엔티티를 영속 상태로 만들 시, 엔티티가 참조하고 있는 엔티티도 함께 영속 상태로 만들 때 사용

가정 상황

  1. order Entity와 orderItem Entity존재
  2. order Entity : orderItem Entity = 1 : N 관계
  3. order Entity에서의 핵심 기능을 많이 사용하니 orderItem Entity에 영속성 전이를 시킬 예정
  • Code

Order Entity

@Entity
@Table(name="orders")
@Getter @Setter
public class Order{

    @Id @GeneratedValue
    @Column(name="order_id")
    private Long id;
    
    private LocalDateTime orderDate;
    
    @OneToMany(mappedBy="order",cascade=CascadeType.ALL)
    private List<OrderItem> orderItems=new ArrayList<>();
    
    public addOrderItem(OrderItem orderItem){
    	orderItems.add(orderItem);
        orderItem.setOrder(this);
    }
}

OrderItem Entity

@Entity
@Getter @Setter
public class OrderItem{

    @Id @GeneratedValue
    @Column(name="orderitem_id")
    private Long id;
    
    private Integer price;
    private Integer quantity;
    
    @ManyToOne(fetchType.LAZY)
    private Order order;
    
    public OrderItem(Integer price,Integer quantity){
    	this.price=price;
        this.quantity=quantity;
    }
}

이와 같은 코드가 있다고 생각하고 진행하겠습니다!

실행 해 볼 코드


// Entitty Manager Factory 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

//EntityManager 생성
EntityManager em = emf.createEntityManager();

//Transaction 생성
EntityTransaction tx = em.getTransaction();

tx.begin();

Order order=new Order();
order.setOrderDate(LocalDateTime.now());

OrderItem orderItem=new OrderItem(1000,20);

order.addOrderItem(orderItem);

//order Entity를 영속 시킴으로서 orderItem도 같이 영속상태가 되는 것임.
em.persist(order);

tx.commit();
//커밋하는 순간 Insert문을 한번에 보냄

CASCADE 핵심 종류

  • ALL : 전이시키는 Entity의 모든 영속성과 관련된 일을 모두 전이
  • PERSIST : 전이시키는 Entity가 영속 상태가 될 때 같이 전이
  • REMOVE : 전이시키는 Entity가 삭제될 때 같이 삭제

고아 객체

부모 Entity와 연관관계가 끊어진 자식 Entity를 말함

  • 고아객체 제거 : orphanRemoval = true
    • 연관관계 매핑 Annotation에 이 기능을 추가하면 됨.
      즉, 부모가 제거되면 자식 Entity를 고아라고 함. 이를 활성화 시켜 놓으면 부모 객체 제거시 자식 객체도 제거된다고 보면 됨!
  • 주의!
    • 자식 Entity가 참조하는 곳이 하나일 때만 사용 가능. 즉, 특정 엔티티만 갖고있을 때만 사용 할 수 있음.
  • 영속성 전이의 ALL 과 고아객체 제거 기능을 모두 활성화??

    자식 Entity는 부모에 따라 생명주기가 관리 될 수 있음.
    부모가 영속할 때는 같이 영속, 제거될 때는 같이 제거 되기 때문!

이상으로 포스팅을 마치도록 하겠습니다. 감사합니다 :)


이 글은 인프런 김영한님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'을 수강하고 작성합니다.
출처:https://www.inflearn.com/course/ORM-JPA-Basic

profile
WEB STUDY & etc.. HELLO!

0개의 댓글