λ°μν
μμμ± μ΄λ? (JPA Persistence)
JPA μμμ μμμ±μ Entityλ₯Ό μꡬμ μΌλ‘ μ μ₯ν΄μ£Όλ νκ²½μ μλ―Έ
μμμ± μ μ΄(cascade)
λ?
μ¬μ μ μ μ : 'μμ νν¬', 'νν¬μ²λΌ νλ₯Έλ€' λΌλ λ»
μν ν° μνλ₯Ό λ³κ²½ν λ, ν΄λΉ μν°ν°μ μ°κ΄λ μν°ν°μ μν λ³νλ₯Ό μ νμν€λ μ΅μ
- μ΄λ, λΆλͺ¨λ Oneμ ν΄λΉνκ³ μμμ Manyμ ν΄λΉ
- EX ) Order μν°ν°κ° μμ λμμ λ ν΄λΉ μν°ν°μ μ°κ΄λμ΄ μλ OrderItem μν°ν°κ° ν¨κ» μμ λκ±°λ, Order μν°ν°λ₯Ό μ μ₯ ν λ Order μν°ν°μ λ΄κ²¨μλ OrderItem μν°ν°λ₯Ό νκΊΌλ²μ μ μ₯ κ°λ₯
- πβοΈ μνκ° μ νλλ λͺ¨μ΅μ νν¬κ° νλ₯΄λ λͺ¨μ΅μΌλ‘ μμ
CASCADE μ’ λ₯ | μ€λͺ |
---|---|
PERSIST | λΆλͺ¨ μν°ν°κ° μμνλ λ, μμ μν°ν°λ μμν |
MERGE | λΆλͺ¨ μν°ν°κ° λ³ν©λ λ, μμ μν°ν°λ λ³ν© |
REMOVE | λΆλͺ¨ μν°ν°κ° μμ λ λ, μ°κ΄λ μμ μν°ν°λ μμ |
REFRESH | λΆλͺ¨ μν°ν°κ° refresh λλ©΄, μ°κ΄λ μμ μν°ν°λ refresh |
DETACH | λΆλͺ¨ μν°ν°κ° detachλλ©΄, μ°κ΄λ μμ μν°ν°λ detach μνλ‘ λ³κ²½ |
ALL | λΆλͺ¨ μν°ν°μ μμμ± μν λ³νλ₯Ό μμ μν°ν°μ λͺ¨λ μ μ΄ |
π μμμ± μ μ΄ μ΅μ μ λ¨μΌ μν°ν°μ μμ ν μ’ μμ μ΄κ³ λΆλͺ¨ μν°ν°μ μμ μν°ν°μ λΌμ΄ν μ¬μ΄ν΄μ΄ μ μ¬ν λ cascade μ΅μ νμ© μΆμ²
μ£Όλ¬Έ μμμ± μ μ΄
Order ν΄λμ€
- λΆλͺ¨ Order Entity Cascade μ§μ
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>();
μ€μ λ‘ μ£Όλ¬Έ μν°ν°λ₯Ό μ μ₯ν λ μμμ± μ μ΄κ° μΌμ΄λλμ§μ λν΄ ν
μ€νΈ μ½λμ£Όλ¬Έ μν°ν°λ₯Ό μ μ₯νλ©΄μ μ£Όλ¬Έ μν μν°ν°λ ν¨κ» μ μ₯λλ κ²½μ°
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
@Transactional
class OrderTest {
@Autowired
OrderRepository orderRepository;
@Autowired
ItemRepository itemRepository;
@PersistenceContext
EntityManager entityManager;
public Item createItem() {
Item item = new Item();
item.setItemName("test");
item.setPrice(10000);
item.setItemDetail("test");
item.setItemSellStatus(ItemSellStatus.SELL);
item.setType("IPHONE");
return item;
}
@Test
void μμμ±_μ μ΄_ν
μ€νΈ() {
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.setOrderPrice(1000);
orderItem.setCount(10);
orderItem.setOrder(order);
order.getOrderItems().add(orderItem);
}
orderRepository.saveAndFlush(order);
entityManager.clear();
Order savedOrder = orderRepository.findById(order.getId())
.orElseThrow(EntityNotFoundException::new);
assertEquals(3, savedOrder.getOrderItems().size());
}
}
order.getOrderItems().add(orderItem);
→ μμ§ μμμ± μ»¨ν μ€νΈμ μ μ₯λμ§ μμ orderItem μν°ν°λ₯Ό order μν°ν°μ λ΄μμ€orderRepository.saveAndFlush(order);
→ order μν°ν°λ₯Ό μ μ₯νλ©΄μ κ°μ λ‘ flushλ₯Ό νΈμΆνμ¬ μμμ± μ»¨ν μ€νΈμ μλ κ°μ²΄λ€μ DBμ λ°μentityManager.clear();
→ μμμ± μ»¨ν μ€νΈ μνλ₯Ό μ΄κΈ°νOrder savedOrder = orderRepository.findById(order.getId()).orElseThrow(EntityNotFoundException::new);
→ μμμ± μ»¨ν μ€νΈλ₯Ό μ΄κΈ°ννκΈ° λλ¬Έμ DBμμ μ£Όλ¬Έ μν°ν°λ₯Ό μ‘°νν¨. select μΏΌλ¦¬λ¬Έμ΄ μ€νλ¨
2λ² μ½λ μ€ν μ, flushλ₯Ό νΈμΆνλ©΄μ μ½μμ°½μ insert μΏΌλ¦¬λ¬Έμ΄ μΆλ ₯λ¨
- μ£Όλ¬Έ λ°μ΄ν°κ° λ¨Όμ DBμ λ°μλ¨
- κ·Έ ν μμμ±μ΄ μ μ΄λλ©΄μ, orderμ λ΄μ λμλ orderItemμ΄ insertλ¨
κ³ μ κ°μ²΄
λΆλͺ¨ μν°ν°μ μ°κ΄ κ΄κ³κ° λμ΄μ§ μμ μν°ν°
μμμ± μ μ΄ κΈ°λ₯κ³Ό κ°μ΄ μ¬μ©νλ©΄ λΆλͺ¨ μν°ν°λ₯Ό ν΅ν΄μ μμμ μλͺ μ£ΌκΈ° κ΄λ¦¬ κ°λ₯
π μ£Όμ
κ³ μ κ°μ²΄ μ κ±° κΈ°λ₯μ μ°Έμ‘°νλ κ³³μ΄ νλμΌ λλ§, μ¬μ©ν΄μΌ ν¨
- Order class
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) private List<OrderItem> orderItems = new ArrayList<>();
μ£Όλ¬Έ μν°ν°μμ μ£Όλ¬Έ μνμ μμ νμ λ orderItem μν°ν°κ° μμ λλ μ§ ν μ€νΈ
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
@Transactional
class OrderTest {
/* μ½λ μλ΅ */
@Autowired
MemberRepository memberRepository;
@Test
void κ³ μκ°μ²΄_μ κ±°_ν
μ€νΈ() {
Order order = this.createOrder();
order.getOrderItems().remove(0);
entityManager.flush();
}
private Order createOrder() {
Order order = new Order();
for (int i = 0; i < 3; i++) {
Item item = createItem();
itemRepository.save(item);
OrderItem orderItem = new OrderItem();
orderItem.setItem(item);
orderItem.setCount(10);
orderItem.setOrderPrice(1000);
orderItem.setOrder(order);
order.getOrderItems().add(orderItem);
}
Member member = new Member();
memberRepository.save(member);
order.setMember(member);
orderRepository.save(order);
return order;
}
728x90
λ°μν
'μ€νλ§ > μΌνλͺ° νλ‘μ νΈ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Auditing (0) | 2022.11.27 |
---|---|
μ§μ° λ‘λ© (0) | 2022.11.27 |
μ°κ΄ κ΄κ³ 맀ν (0) | 2022.11.25 |
νμ΄μ§ κΆν μ€μ νκΈ° (0) | 2022.11.24 |
μν μ€κ³ λ° λ±λ‘νκΈ° (0) | 2022.11.24 |