관리 메뉴

샐님은 개발중

#5. 영속성 전이 본문

포토폴리오/Spring-Boot,JPA - 쇼핑몰사이트 v2

#5. 영속성 전이

샐님 2023. 8. 4. 16:41
728x90
반응형

영속성 전이 : casecade이며 엔티티의 상태를 변경할 때 해당 엔티티와 연관된 엔티티의 상태 변화 전파하는 옵션이다. 

이때 부모는 One에 해당하고 자식은 Many에 해당한다. 

영속성 전이 옵션은 단일 엔티티에 완전히 종속적이고 부모 엔티티와 자식 엔티티의 라이프 사이클이 유사할때 cascade 옵션을 활용하길 권장.

 

Order - OrderItem 

1. 주문 엔티티 저장하기 위한 OrderRepository 생성

package won.shop.Repository;

import org.springframework.data.jpa.repository.JpaRepository;
import won.shop.domain.Order;

public interface OrderRepository extends JpaRepository<Order,Long> {
    
}

2.@OneToMany 어노테이션에 casecade 옵션 추가


@Getter
@Setter
@Entity
@Table(name="orders")
public class Order {
,,,
    @OneToMany(mappedBy = "order",cascade = CascadeType.ALL) 
  
,,,
}

 

3. 실제로 주문 엔티티를 저장할 때 영속성 전이, 즉 order저장시에 orderItem 데이터가 함께 저장되는지  테스트 하기

package won.shop.entity;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityNotFoundException;
import jakarta.persistence.PersistenceContext;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.DisplayName;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import won.shop.Repository.ItemRepository;
import won.shop.Repository.OrderRepository;
import won.shop.constant.ItemSellStatus;
import won.shop.domain.*;

import java.time.LocalDateTime;

import static org.junit.Assert.assertEquals;

@SpringBootTest
@Transactional
public class OrderTest {

    @Autowired
    OrderRepository orderRepository;
    @Autowired
    ItemRepository itemRepository;

    @PersistenceContext
    EntityManager em;


    public Item createItem(){
        Item item = new Item();
        item.setItemNm("테스트 상품");
        item.setPrice(10000);
        item.setItemDetail("상세설명");
        item.setItemSellStatus(ItemSellStatus.SELL);
        item.setStockNumber(100);

        return item;
    }

    @Test
    @DisplayName("영속성 전이 테스트")
    public void cascadeTest() {

        Order order = new Order();

        for(int i=0;i<3;i++){
            Item item = this.createItem();
            itemRepository.save(item);
            OrderItem orderItem = new OrderItem();
            orderItem.setItem(item);
            orderItem.setCount(10);
            orderItem.setOrderPrice(1000);
            orderItem.setOrder(order);
            order.getOrderItems().add(orderItem);
        }

        orderRepository.saveAndFlush(order);
        em.clear();

        Order savedOrder = orderRepository.findById(order.getId())
                .orElseThrow(EntityNotFoundException::new);
        assertEquals(3, savedOrder.getOrderItems().size());
    }


}

 

728x90
반응형