Зачем использовать возвращенный экземпляр после save () в Spring Data JPA Repository?

Вот код:

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

JpaRepository из проекта Spring Data JPA.

Вот код тестирования:

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:

Сохраняет данную сущность.Используйте возвращенный экземпляр для дальнейших операций, так как операция сохранения могла полностью изменить экземпляр объекта.

Вот фактический код для SimpleJpaRepository из Spring Data JPA:

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

Итак, вопрос в том, почему нам нужно использовать возвращенный экземпляр вместо исходного? (да, мы должны это сделать, иначе мы продолжаем работать с отсоединенным экземпляром, но почему)

Исходный метод EntityManager.persist () возвращает void, поэтому наш экземпляр присоединяется к контексту постоянства. Происходит ли какая-то магия прокси при передаче учетной записи для сохранения в репозиторий? Это ограничение архитектуры проекта Spring Data JPA?

55
задан Thom 13 February 2018 в 16:47
поделиться