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로 연결된 엔터티에 복사하고 연결된 엔터티를 반환합니다. 항목이 새 항목이 아니고 반환 된 항목을 사용하지 않는 경우 분리 된 항목을 수정합니다.
'code' 카테고리의 다른 글
지연된 실행을 위해 Thread.Sleep 및 Timer 사용 비교 (0) | 2021.01.08 |
---|---|
너겟 패키지 종속성 계층보기 (0) | 2021.01.08 |
@ConditionalOnProperty 주석의 목적은 무엇입니까? (0) | 2021.01.07 |
항목의 액세스 인덱스에 대한 Aurelia repeat. (0) | 2021.01.07 |
Android 툴바 메뉴 / 아이콘을 Google지도 앱 에서처럼 왼쪽에 정렬하려면 어떻게해야합니까? (0) | 2021.01.07 |