这是代码:
@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {}
来自 Spring Data 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:
保存给定的实体。使用返回的实例进行进一步的操作,因为保存操作可能已经完全改变了实体实例。
这是 Spring Data 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,因此我们的实例附加到持久化上下文。传递帐户以保存到存储库时是否会发生一些代理魔术?是 Spring Data JPA 项目的架构限制吗?