복붙노트

[SPRING] 스프링 데이터 JPA가 entityManager.persist (...) 또는 entityManager.merge (...) 메소드를 호출하는 방법

SPRING

스프링 데이터 JPA가 entityManager.persist (...) 또는 entityManager.merge (...) 메소드를 호출하는 방법

entityManager.persist (...) -Method가 호출되고 springData jpa에서 entityManager.merge (...)가 호출 될 때. 문서에 따르면 : 엔티티가 아직 지속되지 않았다면 Spring Data JPA는 entityManager.persist (...) -Method에 대한 호출을 통해 엔티티를 저장합니다. 그렇지 않으면 entityManager.merge (...) - 메소드가 호출됩니다.

그렇다면 스프링 데이터가 엔티티가 지속되는지 여부를 어떻게 결정합니까?

해결법

  1. ==============================

    1.다음은 SimpleJpaRepository의 save 메소드의 impl입니다.

    다음은 SimpleJpaRepository의 save 메소드의 impl입니다.

    /*
         * (non-Javadoc)
         * @see org.springframework.data.repository.CrudRepository#save(java.lang.Object)
         */
        @Transactional
        public <S extends T> S save(S entity) {
    
            if (entityInformation.isNew(entity)) {
                em.persist(entity);
                return entity;
            } else {
                return em.merge(entity);
            }
        }
    

    그래서 그것은 entityInformation.isNew (entity)를 봅니다. 이 메소드의 구현은 (AbstractPersistable에서) :

    public boolean isNew() {
    
            return null == getId();
        }
    

    그래서 그것은 id 필드를 기반으로 결정합니다.

  2. from https://stackoverflow.com/questions/27573023/how-spring-data-jpa-decides-to-call-entitymanager-persist-or-entitymanager-me by cc-by-sa and MIT license