Search
β˜•

persist vs merge

save() λͺ…μ‹œ μ‹œ SimpleJpaRepository 의 save() λ©”μ„œλ“œμ—μ„œ entityInformation.isNew(entity) 뢄기문을 톡해 em.persist() 인지 em.merge() 인지 νŒλ³„ν•œλ‹€.
isNew() λ©”μ„œλ“œ

Persist

DefaultPersistEventListener μ—μ„œ onPersist μ‹œ νŒŒλΌλ―Έν„°λ‘œ Event 외에도 Cache 둜 ν™œμš©ν•  IdentityHashMap 객체가 μΆ”κ°€λ‘œ ν•„μš”ν•˜λ‹€.

Merge

DefaultPersistEventListener μ—μ„œ onMerge μ‹œ νŒŒλΌλ―Έν„°λ‘œ Event 외에도 Cache 둜 ν™œμš©ν•  MergeContext(IdentityHashMap 을 감싼 객체인듯) 객체가 μΆ”κ°€λ‘œ ν•„μš”ν•˜λ‹€.
switch - case 둜 detach, persistent λ₯Ό κ΅¬λΆ„ν•œλ‹€.

detach

detach μƒνƒœ(clear ν•œ μƒνƒœ)라면 select λ₯Ό λ¨Όμ € ν•΄μ„œ μ˜μ†μ„±μ— μ €μž₯ν•œλ‹€.

persistent

β†’ merge 인 κ²½μš°μ—λŠ” cache 에 λ„£μ–΄λ†“κΈ°λ§Œ ν•˜κ³  쿼리가 μ‹€μ œλ‘œ λ‚˜κ°€μ§€λŠ” μ•ŠλŠ”λ‹€.
flush λ‚˜ 더티체킹 μ‹œμ μ—μ„œ 쿼리가 λ°œμƒν•˜λŠ”λ“―!

cascade λŠ”?

AbstractSaveEventListener 의 performSaveOrReplicate() 을 μˆ˜ν–‰ν•  λ•Œ
β€’
ν•΄λ‹Ή entity 전에 cascade ν•΄μ•Ό ν•˜λ©΄ cascadeBeforeSave()
β€’
ν•΄λ‹Ή entity save λŠ” addInsertion()
β€’
ν•΄λ‹Ή entity 후에 cascade ν•΄μ•Ό ν•˜λ©΄ cascadeAfterSave()
flush event listener μ—μ„œ
LinkedHashMap<Class<? extends Executable>,ListProvider> EXECUTABLE_LISTS_MAP
λ§ν¬λ“œν•΄μ‹œλ§΅μœΌλ‘œ μˆœμ„œκ°€ μ •ν•΄μ Έ μžˆλ‹€!
static {} 으둜 μˆœμ„œλŒ€λ‘œ λ„£λŠ”λ‹€
1.
μ—†λŠ” id 라면?
2.
더티체킹은?