【发布时间】:2012-01-27 08:24:33
【问题描述】:
代码如下:
@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:
保存给定的实体。使用返回的实例进行进一步的操作,因为保存操作可能已经完全改变了实体实例。
这里是 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 项目的架构限制?
【问题讨论】:
标签: java spring jpa spring-data spring-data-jpa