Home
>
Spring
>
π[Spring] JPAμμμ Cascade μ΅μ
Spring
Framework
π[Spring] JPAμμμ Cascade μ΅μ
.
- JPAμμ Cascade μ΅μ
μ μν°ν° κ°μ μ°κ΄κ΄κ³μμ νΉμ μν°ν°μ μνλ μμ
(μ μ₯, μμ λ±)μ΄ μ°κ΄λ λ€λ₯Έ μν°ν°μ ν¨κ» μ μ©λλλ‘ μ€μ νλ μ΅μ
μ
λλ€.
- μ¦, λΆλͺ¨ μν°ν°κ° νΉμ μμ
μ μνν λ μμ μν°ν°λ λμΌν μμ
μ΄ μλμΌλ‘ μ νλκ² λ§λλλ€.
1οΈβ£ Cascade μ΅μ
μ μ’
λ₯.
- Cascade μ΅μ
μλ μ¬λ¬ κ°μ§ μ’
λ₯κ° μμΌλ©°, κ°κ°μ μ΅μ
μ λ€λ₯Έ μμ
μ μ νν©λλ€.
1οΈβ£ CascadeType.PERSIST
- λΆλͺ¨ μν°ν°κ° μ μ₯λ λ, μ°κ΄λ μμ μν°ν°λ ν¨κ» μ μ₯λ©λλ€.
- EntityManager.persist() νΈμΆ μ μμ μν°ν°λ μλμΌλ‘ persistλ©λλ€.
2οΈβ£ CascadeType.MERGE
- λΆλͺ¨ μν°ν°κ° λ³ν©λ λ, μ°κ΄λ μμ μν°ν°λ ν¨κ» λ³ν©λ©λλ€.
- μ¦, EntityManager.merge() νΈμΆ μ μμ μν°ν°λ μλμΌλ‘ mergeλ©λλ€.
3οΈβ£ CascadeType.REMOVE
- λΆλͺ¨ μν°ν°κ° μμ λ λ, μ°κ΄λ μμ μν°ν°λ ν¨κ» μμ λ©λλ€.
- EntityManager.remove() νΈμΆ μ μμ μν°ν°λ μλμΌλ‘ removeλ©λλ€.
4οΈβ£ CascadeType.REFRESH
- λΆλͺ¨ μν°ν°κ° μλ‘ κ³ μΉ¨λ λ, μ°κ΄λ μμ μν°ν°λ ν¨κ» μλ‘ κ³ μΉ¨λ©λλ€.
- EntityManager.refresh() νΈμΆ μ μμ μν°ν°λ refreshλ©λλ€.
5οΈβ£ CascadeType.DETACH
- λΆλͺ¨ μν°ν°κ° μ€μμ μνλ‘ λ³κ²½λ λ, μ°κ΄λ μμ μν°ν°λ ν¨κ» μ€μμ μνλ‘ λ³κ²½λ©λλ€.
- EntityManager.detach() νΈμΆ μ μμ μν°ν°λ μλμΌλ‘ detachλ©λλ€.
6οΈβ£ CascadeType.ALL
- μμ λͺ¨λ μ΅μ
μ μ μ©νμ¬, λͺ¨λ μμ
(persist, merge, remove, refresh, detach)μ΄ μμ μν°ν°μ μ νλλλ‘ ν©λλ€.
2οΈβ£ μμ : CascadeType.PERSISTμ CascadeType.REMOVE μ¬μ©.
- λ€μ μμ μμλ CascadeType.PERSISTμ CascadeType.REMOVEλ₯Ό μ¬μ©νμ¬ λΆλͺ¨ μν°ν° Orderκ° μ μ₯ λ° μμ λ λ, μ°κ΄λ μμ μν°ν° OrderItemλ ν¨κ» μ μ₯ λ° μμ λλ μν©μ 보μ¬μ€λλ€.
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String customerName;
@OneToMany(mappedBy = "order", cascade = {CascadeType.PERSIST, Cascade.REMOVE})
private List<OrderItem> orderItems = new ArrayList<>();
// μ°κ΄κ΄κ³ νΈμ λ©μλ
public void addOrderItem(OrderItem item) {
orderItems.add(item);
item.setOrder(this);
}
// getter, setter
}
@Entity
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String productName;
private int quantity;
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
// getter, setter
}
π μ½λ μ€λͺ
.
- Order μν°ν°μμ orderItems νλλ
@OneToMany
κ΄κ³λ‘ μ€μ λμ΄ μμΌλ©°, casecade = {CascadeType.PERSIST, CascadeType.REMOVE} μ΅μ
μ μ¬μ©ν©λλ€.
- Order μν°ν°κ° persistλ λ OrderItem μν°ν°λ ν¨κ» μ μ₯λκ³ , Order μν°ν°κ° μμ λ λ OrderItem μν°ν°λ ν¨κ» μμ λ©λλ€.
3οΈβ£ μμ μ½λ μ€ν.
Order order = new Order();
order.setCustomerName("Alice");
OrderItem item1 = new OrderItem();
item1.setProductName("Laptop");
item1.setQuantity(1);
OrderItem item2 = new OrderItem();
item2.setProductName("Mouse");
item2.setQuantity(2);
order.addOrderItem(item1);
order.addOrderItem(item2);
entityManager.persist(order); // Orderμ OrderItemλ€μ΄ ν¨κ» μ μ₯λ¨
- μ μ½λμμ entityManager.persist(order)λ₯Ό νΈμΆνλ©΄ Orderμ μ°κ΄λ OrderItem μν°ν°λ€μ΄ ν¨κ» μ μ₯λ©λλ€.
- μ΄ν entityManager.remove(order)λ₯Ό νΈμΆνλ©΄ Orderμ OrderItem μν°ν°λ€μ΄ ν¨κ» μμ λ©λλ€.
4οΈβ£ Cascade μ΅μ
μ¬μ© μ μ£Όμ μ¬ν.
-
CascadeType.REMOVEλ λΆλͺ¨ μν°ν°κ° μμ λ λ μμ μν°ν°λ μμ λλ―λ‘, λΆνμν λ°μ΄ν° μγ
λ₯Ό λ°©μ§νκΈ° μν΄ μ μ€νκ² μ¬μ©ν΄μΌ ν©λλ€.
-
μ°κ΄κ΄κ³κ° 볡μ‘ν κ²½μ° CascadeType.ALLμ μ¬μ©νλ©΄ μλμΉ μμ μ°μμ μμ
μ΄ λ°μν μ μμΌλ―λ‘, κΌ νμν μ΅μ
λ§ μ νμ μΌλ‘ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
-
μλ°©ν₯ μ°κ΄κ΄κ³μμ μν μ°Έμ‘° λ¬Έμ κ° λ°μνμ§ μλλ‘ μ£Όμκ° νμν©λλ€.
5οΈβ£ μμ½.
-
Cascade μ΅μ
μ λΆλͺ¨ μν°ν°μ μνλ μμ
μ΄ μμ μν°ν°μ μλμΌλ‘ μ νλλλ‘ μ€μ νλ κΈ°λ₯μ
λλ€.
- κ° μ΅μ
(PRESIST, MERGE, REMOVE, REFRESH, DETACH, ALL)μ νΉμ μμ
μ λν μ ν λ°©μμ μ μν©λλ€.
- Cascade μ΅μ
μ λ°μ΄ν° μΌκ΄μ± μ μ§μ λμμ΄ λμ§λ§, λΆνμν μ νλ₯Ό λ°©μ§νκΈ° μν΄ μ μ€νκ² μ¬μ©ν΄μΌ ν©λλ€.