code

SpringData JPA Repository에서 save () 후에 반환 된 인스턴스를 사용하는 이유는 무엇입니까?

codestyles 2021. 1. 8. 08:14
반응형

SpringData JPA Repository에서 save () 후에 반환 된 인스턴스를 사용하는 이유는 무엇입니까?


다음은 코드입니다.

@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {}

SpringData JPA 프로젝트의 JpaRepository .

다음은 테스트 코드입니다.

public class JpaAccountRepositoryTest extends JpaRepositoryTest {
    @Inject
    private AccountRepository accountRepository;

    @Inject
    private Account account;

    @Test
    @Transactional
    public void createAccount() {
        Account returnedAccount = accountRepository.save(account);

        System.out.printf("account ID is %d and for returned account ID is %d\n", account.getId(), returnedAccount.getId());
    }
}

결과는 다음과 같습니다.

account ID is 0 and for returned account ID is 1

다음은 CrudReporsitory.save () javadoc에서 가져온 것입니다.

주어진 엔티티를 저장합니다. 저장 작업이 엔티티 인스턴스를 완전히 변경했을 수 있으므로 추가 작업에 반환 된 인스턴스를 사용합니다.

다음은 SpringData JPA의 SimpleJpaRepository에 대한 실제 코드입니다.

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

그래서 질문은 왜 원래 인스턴스 대신 반환 된 인스턴스를 사용해야 하는가입니다. (예,해야합니다. 그렇지 않으면 분리 된 인스턴스로 계속 작업하지만 그 이유는 무엇입니까?)

원래 EntityManager.persist () 메서드는 void를 반환하므로 인스턴스가 지속성 컨텍스트에 연결됩니다. 저장소에 저장할 계정을 전달하는 동안 프록시 마법이 발생합니까? SpringData JPA 프로젝트의 아키텍처 제한입니까?


인터페이스 save(…)메소드는 CrudRepository어떤 상태에 있든 엔티티를 저장하는 것만으로 추상화해야합니다. 따라서 (JPA에서와 같이) 저장소가 저장할 새 엔티티를 구별하더라도 실제 저장소 특정 구현을 노출해서는 안됩니다. 업데이트 할 기존 항목. 방법이 실제로이라고 이유입니다 save(…)하지 create(…)update(…). JPA merge(…)가 호출 될 때 잠재적으로 수행하는 것처럼 저장소 구현이 실제로 완전히 다른 인스턴스를 리턴 할 수 있도록 해당 메소드에서 결과를 리턴합니다 .

따라서 일반적으로 실제 구현과 관련하여 관대하고 (허용 가능하고, 관대하며) JPA에 대한 메소드를 구현하는 것이 API 결정에 더 가깝습니다. 전달 된 엔터티에 대해 수행되는 추가 프록시 메시징이 없습니다.


두 번째 부분을 놓쳤습니다. 엔티티가 새 것이 아니면 merge호출됩니다. merge인수의 상태를 동일한 ID로 연결된 엔터티에 복사하고 연결된 엔터티를 반환합니다. 항목이 새 항목이 아니고 반환 된 항목을 사용하지 않는 경우 분리 된 항목을 수정합니다.

참조 URL : https://stackoverflow.com/questions/8625150/why-use-returned-instance-after-save-on-spring-data-jpa-repository

반응형