π[Spring] JPAμμμ orphanRemoval μ΅μ .
- orphanRemoval μ΅μ μ JPAμμ λΆλͺ¨ μν°ν°μμ μ°κ΄κ΄κ³κ° λμ΄μ§ Orphan Object(κ³ μ κ°μ²΄)λ₯Ό μλμΌλ‘ μμ νλ κΈ°λ₯μ μ 곡ν©λλ€.
- λΆλͺ¨ μν°ν°μμ μμ μν°ν°μμ κ΄κ³λ₯Ό μ κ±°ν λ, λ°μ΄ν°λ² μ΄μ€μμλ μλμΌλ‘ ν΄λΉ μμ μν°ν°κ° μμ λλλ‘ νλ μ΅μ μ λλ€.
1οΈβ£ orphanRemoval μ¬μ© μμ.
-
λΆλͺ¨ μν°ν° Orderμ μμ μν°ν° OrderItem κ°μ 1:N κ΄κ³μμ orphanRemoval = trueλ₯Ό μ€μ νλ©΄, Orderμμ κ΄κ³κ° λκΈ΄ OrderItem κ°μ²΄λ λ°μ΄ν°λ² μ΄μ€μμ μλμΌλ‘ μμ λ©λλ€.
```java
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;private String customerName;
@OneToMany(mappedBy = βorderβ, cascade = Cascade = CascadeType.ALL, orphanRemoval = true)
private ListorderItems = new ArrayList<>(); // μ°κ΄κ΄κ³ νΈμ λ©μλ
public void addOrderItem(OrderItem item) {
orderItems.add(item);
item.setOrder(this);
}public void removeOrderItem(OrderItem item) {
orderItems.remove(item);
item.setOrder(null); // λΆλͺ¨μμ κ΄κ³λ₯Ό λμ
}// 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 } ```
2οΈβ£ orphanRemoval μλ λ°©μ
- Order μν°ν°μμ orderItems νλμ orphanRemoval = trueλ₯Ό μ€μ νμ΅λλ€.
- removeOrderItem() λ©μλλ₯Ό ν΅ν΄ orderItems 리μ€νΈμμ OrderItem κ°μ²΄λ₯Ό μ κ±°νκ³ , OrderItemμ order νλλ₯Ό nullλ‘ μ€μ ν΄ λΆλͺ¨μμ κ΄κ³λ₯Ό λμ΅λλ€.
- μ΄λ orphanRemoval = trueλ‘ μ€μ λμ΄ μκΈ° λλ¬Έμ, JPAλ κ΄κ³κ° λμ΄μ§ 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λ€μ΄ ν¨κ» μ μ₯λ¨
order.removeOrderItem(item1); // Orderμμ κ΄κ³λ₯Ό λμ
entityManager.merge(order); // item1μ λ°μ΄ν°λ² μ΄μ€μμ μλμΌλ‘ μμ λ¨
4οΈβ£ orphanRemovalκ³Ό CascadeType.REMOVEμ μ°¨μ΄μ .
- CascadeType.REMOVE
- λΆλͺ¨ μν°ν°κ° μμ λ λ μ°κ΄λ μμ μν°ν°λ₯Ό μμ ν©λλ€.
- orphanRemoval = true
- λΆλͺ¨μμ κ΄κ³κ° λκΈ΄ Orphan Object(κ³ μ κ°μ²΄)λ₯Ό μλμΌλ‘ μμ ν©λλ€.
- λΆλͺ¨ μν°ν°κ° μμ λμ§ μλλΌλ κ΄κ³κ° λκΈ΄ μμ μν°ν°λ§ κ°λ³μ μΌλ‘ μμ λ©λλ€.
- λΆλͺ¨μμ κ΄κ³κ° λκΈ΄ Orphan Object(κ³ μ κ°μ²΄)λ₯Ό μλμΌλ‘ μμ ν©λλ€.
5οΈβ£ orphanRemoval μ¬μ© μ μ£Όμ μ¬ν.
- 1:N κ΄κ³μμ μμ μν°ν°μ μλͺ μ£ΌκΈ°κ° λΆλͺ¨ μν°ν°μ μ’ μλ λ μ¬μ©ν©λλ€.
- μλ°©ν₯ κ΄κ³μμ orphanRemovalμ μ€μ ν κ²½μ°, μν μ°Έμ‘°λ μκΈ°μΉ μμ μμ κ° λ°μνμ§ μλλ‘ μμͺ½ νλλ₯Ό λͺ¨λ κ΄λ¦¬ν΄μΌ ν©λλ€.
- μλͺ» μ¬μ©νλ©΄ μλμΉ μμ λ°μ΄ν° μμ κ° λ°μν μ μμΌλ―λ‘, λΆλͺ¨ μν°ν°μ μμ μν°ν°μ κ΄κ³κ° νμ€ν μ’ μμ μΈ κ²½μ°μλ§ μ¬μ©ν΄μΌ ν©λλ€.
6οΈβ£ μμ½.
- orphanRemoval μ΅μ μ λΆλͺ¨μμ μ°κ΄κ΄κ³κ° λκΈ΄ μμ μν°ν°(Orphan Object, κ³ μ κ°μ²΄)λ₯Ό μλμΌλ‘ μμ νλ κΈ°λ₯μ λλ€.
- CascadeType.REMOVEμλ λ€λ₯΄κ² λΆλͺ¨ μν°ν°κ° μμ λμ§ μμλ κ΄κ³κ° λκΈ΄ μμ μν°ν°λ§ μμ ν μ μμ΅λλ€.