πŸ‘Ά κ³ μ•„ 객체

JPAλŠ” λΆ€λͺ¨ 엔티티와 연관관계가 λŠμ–΄μ§„ μžμ‹ μ—”ν‹°ν‹°λ₯Ό μžλ™μœΌλ‘œ μ‚­μ œν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.(κ³ μ•„ 객체(ORPHAN))

λΆ€λͺ¨ μ—”ν‹°ν‹°μ˜ μ»¬λ ‰μ…˜μ—μ„œ μžμ‹ μ—”ν‹°ν‹°μ˜ 참쑰만 μ œκ±°ν•˜λ©΄ μžμ‹ μ—”ν‹°ν‹°κ°€ μžλ™μœΌλ‘œ μ‚­μ œλœλ‹€.

@Entitypublic class Parent{    ...    @OneToMany(mappedBy = "parent", orphanRemoval = true)    private List<Child> children = new ArrayList<>();    ...}

μ»¬λ ‰μ…˜μ— orphanRemoval = true μ˜΅μ…˜μ„ 톡해 κ³ μ•„ 객체 제거 κΈ°λŠ₯을 ν™œμ„±ν™” μ‹œν‚¬ 수 μžˆλ‹€.

Parent parent = em.find(Parent.class, id);parent.getChildren().remove(0); // μžμ‹ μ—”ν‹°ν‹°λ₯Ό μ»¬λ ‰μ…˜μ—μ„œ 제거//μ‹€ν–‰κ²°κ³Ό SQL//DELETE FROM CHILD WHERE ID = ?

λΆ€λͺ¨ μ—”ν‹°ν‹°μ˜ μ»¬λ ‰μ…˜μ—μ„œ μžμ‹μ— μ°Έμ‘°λ₯Ό λŠμ–΄λ²„λ¦¬λ©΄ μžλ™μœΌλ‘œ DBμ—μ„œλ„ μžμ‹μ΄ μ‚­μ œκ°€ λœλ‹€.

κ³ μ•„ 객체 제거 κΈ°λŠ₯은 μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλ₯Ό ν”ŒλŸ¬μ‹œν•  λ•Œ μ μš©λ˜λ―€λ‘œ ν”ŒλŸ¬μ‹œ μ‹œμ μ— DELETE SQL이 μ‹€ν–‰λœλ‹€.

λͺ¨λ“  μžμ‹ 제거 : parent.getChildren().clear()둜 μ»¬λ ‰μ…˜μ„ λΉ„μš΄λ‹€.

πŸ“ 정리

κ³ μ•„ 객체 μ œκ±°λŠ” μ°Έμ‘°κ°€ 제거된 μ—”ν‹°ν‹°λŠ” λ‹€λ₯Έ κ³³μ—μ„œ μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” κ³ μ•„ 객체둜 보고 μ‚­μ œν•˜λŠ” κΈ°λŠ₯이닀.

λ”°λΌμ„œ 이 κΈ°λŠ₯은 μ°Έμ‘°ν•˜λŠ” 곳이 ν•˜λ‚˜μΌ λ•Œλ§Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

λ§Œμ•½ μ‚­μ œν•œ μ—”ν‹°ν‹°λ₯Ό λ‹€λ₯Έ κ³³μ—μ„œλ„ μ°Έμ‘°ν•œλ‹€λ©΄ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

μ΄λŸ¬ν•œ 이유둜 orphanRemoval은 @OneToMany, @OneToOne μ—λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

κ°œλ…μ μœΌλ‘œ λ³Ό λ•Œ λΆ€λͺ¨λ₯Ό μ œκ±°ν•˜λ©΄ μžμ‹μ€ κ³ μ•„κ°€ λœλ‹€.

λ”°λΌμ„œ λΆ€λͺ¨λ₯Ό μ œκ±°ν•˜λ©΄ μžμ‹λ„ 같이 μ œκ±°λœλ‹€.(=CascadeType.REMOVE)