为什么在Spring Data JPA存储库上使用save()后返回的实例?
代码如下:
@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项目的架构限制吗?