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.
더티체킹은?