복붙노트

[SPRING] save () 전에 스프링 데이터 JPA가 SELECT를 수행하지 못하게하려면 어떻게합니까?

SPRING

save () 전에 스프링 데이터 JPA가 SELECT를 수행하지 못하게하려면 어떻게합니까?

기존 데이터베이스에 대해 새 앱을 작성 중입니다. Spring Data JPA를 사용하고 있으며 단순히

MyRepository.save() 

새 엔티티에서

MyRepository extends CrudRepository<MyThing, String>

로그에서 최대 절전 모드가 삽입 전에 선택을 수행하고 인덱스를 사용할 때도 시간이 오래 걸린다는 것을 알았습니다.

여기에서 이것을 검색했으며 일반적으로 찾은 답변은 특히 최대 절전 모드와 관련이 있습니다. 저는 JPA를 처음 접했고 JPA와 Hibernate가 적어도 Spring Data의 맥락에서 사용할 때 밀접하게 얽혀있는 것처럼 보입니다. 링크 된 답변은 Hibernate persist ()를 사용하거나 어떻게 든 entityManager에서 세션을 사용하라고 제안합니까? 세션이나 entityManagers 또는 Hibernate API와 직접 관련이 없었습니다. 지금까지 저의 저장소에 save () 및 몇 가지 @Query를 사용하여 간단한 삽입을 얻었습니다.

해결법

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

    1.다음은 Spring Data 저장소를 사용하여 사용중인 Spring SimpleJpaRepository의 코드입니다.

    다음은 Spring Data 저장소를 사용하여 사용중인 Spring SimpleJpaRepository의 코드입니다.

    @Transactional
    public <S extends T> S save(S entity) {
    
        if (entityInformation.isNew(entity)) {
            em.persist(entity);
            return entity;
        } else {
            return em.merge(entity);
        }
    }
    

    다음을 수행합니다.

    스프링 데이터 문서에 링크

    따라서 엔티티 중 하나에 null이 아닌 ID 필드가있는 경우 Spring은 Hibernate가 업데이트를 수행하도록합니다 (따라서 SELECT를 수행하십시오).

    동일한 문서에 나열된 두 가지 방법으로이 동작을 무시할 수 있습니다. 쉬운 방법은 Entity가 Persistable (Serializable 대신)을 구현하도록하여 "isNew"메소드를 구현하는 것입니다.

  2. ==============================

    2.자신의 id 값을 제공하면 Spring Data는 DB에 중복 키가 있는지 확인해야한다고 가정합니다 (따라서 선택 + 삽입).

    자신의 id 값을 제공하면 Spring Data는 DB에 중복 키가 있는지 확인해야한다고 가정합니다 (따라서 선택 + 삽입).

    더 나은 방법은 다음과 같은 ID 생성기를 사용하는 것입니다.

    @Entity
    public class MyThing {
        @Id
        @GeneratedValue(generator = "uuid2")
        @GenericGenerator(name = "uuid2", strategy = "uuid2")
        private UUID id;
    }
    

    실제로 자신의 ID를 삽입해야하고 선택 + 삽입을 방지하려면 Persistable을 구현하십시오 (예 :

    @Entity
    public class MyThing implements Persistable<UUID> {
    
        @Id
        private UUID id;
    
        @Override
        public UUID getId() {
            return id;
        }
    
        //prevent Spring Data doing a select-before-insert - this particular entity is never updated
        @Override
        public boolean isNew() {
            return true;
        }
    }
    
  3. from https://stackoverflow.com/questions/45635827/how-do-i-stop-spring-data-jpa-from-doing-a-select-before-a-save by cc-by-sa and MIT license