복붙노트

[SPRING] Spring JpaRepository - 엔티티 분리 및 연결

SPRING

Spring JpaRepository - 엔티티 분리 및 연결

나는 스프링 부트를 사용하고 jpa를 통해 최대 절전 모드로 전환한다. 내 저장소를 구현하는 JpaRepository 인터페이스를 사용하고 있습니다. 다음과 같은 UserRepository

public interface UserRepository extends JpaRepository<User, Long> {
}

나는 다음과 같은 것을 달성하고 싶다.

위의 모든 단계가 한 거래에서 일어나지 않습니다. 즉 외부 서비스 통화가 거래가되지 않습니다.

웹 서비스 결과를 리포지토리를 통해 DB에 저장하면 사용자 엔티티의 변경 사항도 저장됩니다. 내 이해에 따라 이것은 # 3 단계에서 지속성 컨텍스트를 플러시하기 때문입니다. 일부 Google의 경우 1 단계에서 내 사용자 엔티티를 분리하고 4 단계에서 다시 첨부 할 수 있다면 자신의 목적을 달성 할 수 있다고 생각합니다. 제 이해가 정확한지 그리고 어떻게 이것을 할 수 있는지 확인해주십시오. 엔터티를 분리하는 JpaRepository 인터페이스에는 메소드가 없습니다.

다음은 설명 할 코드입니다.

public void updateUser(int id, String name, int changeReqId){
    User mUser = userRepository.findOne(id); //1
    mUser.setName(name); //2

    ChangeRequest cr = changeRequestRepository.findOne(changeReqId);
    ChangeResponse rs = userWebService.updateDetails(mUser); //3

    if(rs.isAccepted()){
        userRepository.saveAndFlush(mUser); //4
    }

    cr.setResponseCode(rs.getCode());
    changeRequestRepository.saveAndFlush(cr); //this call also saves the changes at step 2
}

감사

해결법

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

    1.JPA 2.0을 사용하는 경우 EntityManager # detach ()를 사용하여 지속성 컨텍스트에서 단일 엔터티를 분리 할 수 ​​있습니다. 또한, Hibernate는 같은 목적을 수행하는 Session # evict ()를 가지고있다.

    JPA 2.0을 사용하는 경우 EntityManager # detach ()를 사용하여 지속성 컨텍스트에서 단일 엔터티를 분리 할 수 ​​있습니다. 또한, Hibernate는 같은 목적을 수행하는 Session # evict ()를 가지고있다.

    JpaRepository는이 기능 자체를 제공하지 않기 때문에 다음과 같이 사용자 정의 구현을 추가 할 수 있습니다.

    public interface UserRepositoryCustom {
        ...
       void detachUser(User u);
        ...
    }
    
    public interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom {
        ...
    }
    
    @Repository
    public class UserRepositoryCustomImpl implements UserRepositoryCustom {
        ...
        @PersistenceContext
        private EntityManager entityManager;
    
        @Override
        public void detachUser(User u) {
            entityManager.detach(u);
        }
        ...
    }
    

    나는이 코드를 시도하지 않았지만 제대로 작동 할 수 있어야한다. @PersistenceContext를 사용하여 서비스 클래스 (updateUser ()가있는)의 EntityManager를 보류하고 사용자 정의 구현을 저장소에 추가하는 번거 로움을 피할 수도 있습니다.

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

    2.entityManager.clear ()는 모든 JPA 객체의 연결을 끊습니다. 따라서 연결하려는 다른 객체가있는 경우 모든 경우에 적절한 해결책이 아닐 수도 있습니다.

    entityManager.clear ()는 모든 JPA 객체의 연결을 끊습니다. 따라서 연결하려는 다른 객체가있는 경우 모든 경우에 적절한 해결책이 아닐 수도 있습니다.

    /**
     * Clear the persistence context, causing all managed
     * entities to become detached. Changes made to entities that
     * have not been flushed to the database will not be
     * persisted.
     */
    public void clear();
    

    entityManager.detach (엔티티); 지속성 컨텍스트에서 지정된 엔티티를 제거합니다.

    /**
     * Remove the given entity from the persistence context, causing
     * a managed entity to become detached.  Unflushed changes made
     * to the entity if any (including removal of the entity),
     * will not be synchronized to the database.  Entities which
     * previously referenced the detached entity will continue to
     * reference it.
     * @param entity  entity instance
     * @throws IllegalArgumentException if the instance is not an
     *         entity
     * @since Java Persistence 2.0
     */
    public void detach(Object entity);
    
  3. from https://stackoverflow.com/questions/26795436/spring-jparepository-detach-and-attach-entity by cc-by-sa and MIT license