Entity Lifecycle

Entity Lifecycle
OperationsDescription
DetachIf entity is detached, it is not associated with a Hibernate session
MergeIf instance is detached from session, then merge will reattach to session
PersistTransitions new instances to managed state. Next flush / commit will save in db.
RemoveTransitions managed entity to be removed. Next flush / commit will delete from db.
RefreshReload / synch object with data from db. Prevents stale data

1.Β λΉ„μ˜μ† (New/Transient)

  • μ •μ˜: μ—”ν‹°ν‹°κ°€ μƒμ„±λ˜μ—ˆμ§€λ§Œ 아직 μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ™€ μ—°κ²°λ˜μ§€ μ•Šμ€ μƒνƒœμž…λ‹ˆλ‹€.
  • νŠΉμ§•:
    • JPA와 λ¬΄κ΄€ν•œ 순수 μžλ°” κ°μ²΄μž…λ‹ˆλ‹€.
    • λ³€κ²½ 감지(Dirty Checking), 1μ°¨ μΊμ‹œ λ“± μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ˜ κΈ°λŠ₯이 μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • μ˜ˆμ‹œ java Member member = new Member("user1"); // λΉ„μ˜μ† μƒνƒœ

2.Β μ˜μ† (Managed)

  • μ •μ˜: μ—”ν‹°ν‹°κ°€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ €μž₯λ˜μ–΄ κ΄€λ¦¬λ˜λŠ” μƒνƒœμž…λ‹ˆλ‹€.
  • νŠΉμ§•:
    • em.persist(),Β em.find(), JPQL 쿼리 결과둜 μ˜μ† μƒνƒœκ°€ λ©λ‹ˆλ‹€.
    • λ³€κ²½ 감지가 ν™œμ„±ν™”λ˜μ–΄, νŠΈλžœμž­μ…˜ 컀밋 μ‹œ μžλ™μœΌλ‘œ DB에 λ°˜μ˜λ©λ‹ˆλ‹€
    • 1μ°¨ μΊμ‹œμ— μ €μž₯되며, λ™μΌν•œ μ‹λ³„μžλ‘œ 쑰회 μ‹œ μΊμ‹œμ—μ„œ λ°˜ν™˜λ©λ‹ˆλ‹€
  • μ˜ˆμ‹œ: java em.persist(member); // μ˜μ† μƒνƒœλ‘œ μ „ν™˜

3.Β μ€€μ˜μ† (Detached)

  • μ •μ˜: μ˜μ† μƒνƒœμ˜ μ—”ν‹°ν‹°κ°€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ—μ„œ λΆ„λ¦¬λœ μƒνƒœμž…λ‹ˆλ‹€.
  • νŠΉμ§•:
    • em.detach(),Β em.clear(),Β em.close()둜 μ „ν™˜λ©λ‹ˆλ‹€
    • λ³€κ²½ 감지와 1μ°¨ μΊμ‹œ κΈ°λŠ₯이 λΉ„ν™œμ„±ν™”λ©λ‹ˆλ‹€.
    • μ‹λ³„μž(ID)λŠ” μœ μ§€λ˜λ©°,Β merge()λ₯Ό 톡해 λ‹€μ‹œ μ˜μ† μƒνƒœλ‘œ 볡귀할 수 μžˆμŠ΅λ‹ˆλ‹€
  • μ˜ˆμ‹œ: java em.detach(member); // μ€€μ˜μ† μƒνƒœλ‘œ μ „ν™˜

μƒνƒœ 전이 비ꡐ

μƒνƒœμ˜μ†μ„± μ»¨ν…μŠ€νŠΈ 관리변경 감지1μ°¨ μΊμ‹œDB 동기화
λΉ„μ˜μ†βŒβŒβŒβŒ
μ˜μ†βœ…βœ…βœ…νŠΈλžœμž­μ…˜ 컀밋 μ‹œ
μ€€μ˜μ†βŒβŒβŒβŒ

4.Β μ‚­μ œ (Removed)

  • μ •μ˜: μ—”ν‹°ν‹°κ°€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ™€ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‚­μ œλœ μƒνƒœμž…λ‹ˆλ‹€.
  • μ˜ˆμ‹œ:
    em.remove(member); // μ‚­μ œ μƒνƒœ

μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ˜ 핡심 κΈ°λŠ₯

  1. 1μ°¨ μΊμ‹œ: μ˜μ† μƒνƒœμ˜ μ—”ν‹°ν‹°λ₯Ό μΊμ‹œν•˜μ—¬ 쑰회 μ„±λŠ₯ ν–₯상
  2. λ³€κ²½ 감지 (Dirty Checking): μ—”ν‹°ν‹°μ˜ λ³€κ²½ 사항을 μžλ™μœΌλ‘œ DB에 반영
  3. μ“°κΈ° μ§€μ—° (Transactional Write-Behind): INSERT/UPDATE 쿼리λ₯Ό νŠΈλžœμž­μ…˜ 컀밋 μ‹œ ν•œ λ²ˆμ— μ‹€ν–‰
  4. 동일성 보μž₯: 같은 μ‹λ³„μžμ˜ μ—”ν‹°ν‹°λŠ” 항상 λ™μΌν•œ μΈμŠ€ν„΄μŠ€ λ°˜ν™˜

μƒνƒœ 전이 μ˜ˆμ‹œ μ½”λ“œ

// λΉ„μ˜μ† β†’ μ˜μ† 
Member member = new Member("user1"); 
em.persist(member);  
 
// μ˜μ† β†’ μ€€μ˜μ† 
em.detach(member);  
 
// μ€€μ˜μ† β†’ μ˜μ† (병합) 
Member mergedMember = em.merge(member);  
 
// μ˜μ† β†’ μ‚­μ œ 
em.remove(mergedMember);

κ²°λ‘ 

  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλŠ” μ—”ν‹°ν‹°μ˜ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λ©°, 효율적인 DB 연산을 μ§€μ›ν•©λ‹ˆλ‹€.
  • λΉ„μ˜μ†μ€ JPA와 λ¬΄κ΄€ν•œ μƒνƒœ,Β μ˜μ†μ€ 관리 λŒ€μƒ,Β μ€€μ˜μ†μ€ λΆ„λ¦¬λœ μƒνƒœλ‘œ 이해해야 ν•©λ‹ˆλ‹€.
  • μƒνƒœ 전이λ₯Ό 톡해 μ—”ν‹°ν‹°μ˜ 생λͺ…μ£ΌκΈ°λ₯Ό μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.