Вот код:
@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {}
JpaRepository из проекта данных 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 Данные 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?