[JPA] μμμ± μ μ΄ by Cascade μ΅μ
by rlaehddnd0422μμμ± μ μ΄
μμμ± μ μ΄λ νΉμ μν°ν°λ₯Ό μμ μνλ‘ λ§λ€ λ μ°κ΄λ μν°ν°λ ν¨κ» μμμνλ‘ λ§λ€κ³ μΆμ λ μ¬μ©νλ μ΅μ μ λλ€.
JPAλ λ€μ€μ± μ΄λ Έν μ΄μ (@ManyToOne, @OneToMany λ±)μ cascade μ΅μ μΌλ‘ μμμ± μ μ΄λ₯Ό μ 곡ν©λλ€. μ½κ² λ§ν΄ μμμ± μ μ΄λ₯Ό μ¬μ©νλ©΄ λΆλͺ¨ μν°ν°λ₯Ό μ μ₯ν λ μμ μν°ν°λ ν¨κ» μ μ₯ν μ μμ΅λλ€.
Parent
@Entity
public class Parent {
@Id @GeneratedValue
@Column(name = "PARENT_ID")
private Long id;
@OneToMany(mappedBy = "parent")
private List<Child> children = new ArrayList<Child>();
public List<Child> getChildren() {
return children;
}
}
Child
@Entity
public class Child {
@Id
@GeneratedValue
@Column(name = "CHILD_ID")
private Long id;
@ManyToOne
@JoinColumn(name = "PARENT_ID")
private Parent parent;
public void setParent(Parent parent) {
if(this.parent == null)
{
this.parent = parent;
parent.getChildren().add(this);
}
}
}
μμ²λΌ Parent(1) ↔οΈ Children(*) μ°κ΄κ΄κ³λ₯Ό κ°μ§ λ μμμ± μ μ΄μ΅μ μ μ¬μ©νμ§ μκ³ Parentμ Child μν°ν°λ₯Ό λͺ¨λ μ μ₯νλ €λ©΄ λ μν°ν° λͺ¨λ λ€ μμμνλ‘ κ°κ° λ§λ€μ΄ μ£Όμ΄μΌ ν©λλ€.
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try
{
Parent parent = new Parent();
em.persist(parent);
Child child = new Child();
child.setParent(parent); // Child -> Parent
parent.getChildren().add(child); // Parent -> Child
em.persist(child);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
}
- μλ°©ν₯ μ°κ΄κ΄κ³ 맀ν ν Parent μν°ν°λ em.persist, Child μν°ν°λ em.persist
- νμ§λ§ μ¬κΈ°μ μμμ± μ μ΄ μ΅μ μ μ¬μ©νλ©΄ Parent μν°ν°λ§ persistνλ©΄ Child μν°ν°λ λ°λ‘ persistν΄μ£Όμ§ μμλ λ©λλ€.
cascade μ΅μ μ μ©
Parent
@Entity
public class Parent {
@Id @GeneratedValue
@Column(name = "PARENT_ID")
private Long id;
@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
private List<Child> children = new ArrayList<Child>();
public List<Child> getChildren() {
return children;
}
}
μ μ₯νλ μ½λ
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try
{
Parent parent = new Parent();
em.persist(parent);
Child child = new Child();
child.setParent(parent); // Child -> Parent
parent.getChildren().add(child); // Parent -> Child
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
}
- em.persist(child) λΆλΆμ΄ μ κ±°λμμ΅λλ€.
- em.persist(parent)λ₯Ό μνν λ μμμ± μ μ΄ μ΅μ
μ μ€μ ν΄λμκΈ° λλ¬Έμ persistλ‘ parent μν°ν°λ₯Ό μμν ν λ child μν°ν°λ μλμΌλ‘ μμνκ° μ§νλ©λλ€.
- commit μμ μ flush()λ‘ DBμ λ°μ.
CASCADE μ’ λ₯
μμμ± μ μ΄λ μ½μ λΏλ§ μλλΌ μμμ± μ»¨ν μ€νΈμ μμ , λ³ν©, λ± μ¬λ¬κ°μ§ μ΅μ μ΄ μμ΅λλ€.
public enum CascadeType {
ALL,
PERSIST,
MERGE,
REMOVE,
REFRESH,
DETACH;
private CascadeType() {
}
}
- ALL : λͺ¨λ μ μ©
- remove : μμμ± μ»¨ν μ€νΈμμ μν°ν°κ° μμ λ λ, μ°κ΄λ μν°ν°λ ν¨κ» μμ
- merge : μ€μμ μνμ μν°ν°λ₯Ό μμ μνλ‘ λ€μ λ³κ²½ν λ μ°κ΄λ μν°ν°λ ν¨κ» λ³κ²½
persist, remove μ΅μ μ flush()λ₯Ό νΈμΆ(컀λ°)ν λ μ μ΄κ° λ°μν©λλ€.
κ³ μ κ°μ²΄
JPAλ μ°κ΄κ΄κ³κ° λμ΄μ§ μν°ν°λ₯Ό μλμΌλ‘ μμ νλ κΈ°λ₯μ μ 곡ν©λλ€. μ΄λ₯Ό κ³ μ κ°μ²΄ μ κ±°λΌκ³ ν©λλ€.
κ³ μκ°μ²΄ μ κ±° κΈ°λ₯κ³Ό cascade μ΅μ μ removeμ μ°¨μ΄
- κ³ μ κ°μ²΄ μ κ±° κΈ°λ₯μ μ°Έμ‘°λ₯Ό μ κ±°νμ¬ μ°κ΄κ΄κ³κ° λμ΄μ§ μν°ν°λ§ μμ
- cascade μ΅μ μ remove λ μμμνμ μν°ν°κ° μμ λ λ μ°κ΄λ μν°ν°λ ν¨κ» μμ
λΆλͺ¨ μν°ν°μ 컬λ μ μμ μμ μν°ν°μ μ°Έμ‘°λ§ μ κ±°νλ©΄ μμ μν°ν°κ° μλμΌλ‘ μμ λ©λλ€.
@OneToMany(mappedBy = "parent", orphanRemoval = true)
private List<Child> children = new ArrayList<Child>();
- λ€μ€μ± μ΄λ Έν μ΄μ μ orphanRemoval μ΅μ μ trueλ‘ μ€μ νλ©΄ κ³ μ κ°μ²΄ μ κ±° κΈ°λ₯μ΄ μ μ©λ©λλ€.
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try
{
Parent parent = em.find(Parent.class, 1L);
parent.getChildren().remove(0); // μμ μν°ν°λ₯Ό 컬λ μ
μμ μ κ±°
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
}
μ°Έμ‘°κ° μ κ±°λ μν°ν°λ λ€λ₯Έκ³³μμ μ°Έμ‘°νμ§ μλ κ³ μ κ°μ²΄λ‘ λ³΄κ³ μμ νλ κΈ°λ₯μ λλ€.
λ§μ½ μμ ν μν°ν°λ₯Ό λ€λ₯Έκ³³μμ μ°Έμ‘°νλ€λ©΄ λ¬Έμ κ° λ μ μκΈ° λλ¬Έμ μ΄ κΈ°λ₯μ μ°Έμ‘°νλ κ³³μ΄ νλμΌ λλ§ μ¬μ©ν΄μΌ ν©λλ€.
μ¦, @OneToMany,@OneToOneμλ§ μ¬μ© κ°λ₯.
+ κ³ μ κ°μ²΄ μ κ±° κΈ°λ₯μ λΆλͺ¨λ₯Ό μ κ±°νλ©΄ μμμ κ³ μκ° λκΈ° λλ¬Έμ Cascade.removeλ₯Ό μ€μ ν κ²κ³Ό κ°μ΅λλ€.
Tip
CascadeType.All κ³Ό orphanRemoval μ λͺ¨λ μ μ©νλ©΄ λΆλͺ¨ μν°ν°λ₯Ό ν΅ν΄μ μμμ μλͺ μ£ΌκΈ°λ₯Ό κ΄λ¦¬ν μ μμ
μμμ μ μ₯νλ €λ©΄ λΆλͺ¨λ§ μ μ₯, μμμ μμ νλ €λ©΄ λΆλͺ¨λ§ μμ
<μ 리>
- κ°μ²΄λ₯Ό μ μ₯, μμ ν λ μ°κ΄λ κ°μ²΄λ ν¨κ» μ μ₯, μμ νκ³ μΆμ κ²½μ° μμμ± μ μ΄ κΈ°λ₯μ μ¬μ©ν©λλ€.
- μ°κ΄κ΄κ³κ° λμ΄μ§ μν°ν°λ₯Ό μλμΌλ‘ μμ νλ €λ©΄ κ³ μ κ°μ²΄ μ κ±° κΈ°λ₯μ μ¬μ©νλ©΄ λλλ°, μ μ©νμ λ λΆλͺ¨ κ°μ²΄λ₯Ό μμ νλ κ²½μ° μμμ κ³ μκ° λλ¬Έμ μλμΌλ‘ μμ λλ―λ‘ CascadeType.removeλ₯Ό μ μ©ν κ²κ³Ό λμΌ
<μ°Έκ³ μλ£>
'π Backend > Spring Data JPA' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JPA] JPQL λ¬Έλ² 1 - κΈ°λ³Έ λ¬Έλ², νλΌλ―Έν° λ°μΈλ©, νλ‘μ μ , νμ΄μ§ (0) | 2023.05.09 |
---|---|
[JPA] κ° νμ - μλ² λλ κ° νμ , 컬λ μ κ° νμ (0) | 2023.05.08 |
[JPA] νλ‘μ(Proxy)μ μ§μ°λ‘λ©(Lazy Loading) (0) | 2023.05.04 |
[JPA] κ³ κΈ λ§€ν : 맀ν μ λ³΄λ§ μ 곡νκΈ° using @MappedSuperClass (0) | 2023.05.03 |
[JPA] κ³ κΈ λ§€ν : μμ κ΄κ³ 맀ν (0) | 2023.05.03 |
λΈλ‘κ·Έμ μ 보
Study Repository
rlaehddnd0422