这里是代码:
所以,问题是为什么我们需要使用返回的实例而不是原始实例?(是的,我们必须这样做,否则我们将继续使用分离的实例,但为什么)
原始的EntityManager.persist()方法返回void,因此我们的实例已附加到持久性上下文。在将帐户传递给存储库保存时是否发生了某些代理魔法?这是Spring Data JPA项目的架构限制吗?
@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()的Java文档:
保存给定的实体。使用返回的实例进行进一步操作,因为保存操作可能完全更改实体实例。
以下是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项目的架构限制吗?
save
保存一个实体,其中有几个空列。但是这些列在数据库中具有默认值,并且在数据库中保存正常。但是,从save
返回的实体对于默认列具有所有空值。为什么会出现这种行为? - Naanavanalla@GeneratedValue
,但指定仅与主键一起使用。也就是说,JPA目前不支持此功能。 - Oliver Drotbohm