我注意到在spring-data的JpaRepository中,使用save(T entity)
方法时出现了非常奇怪的行为。
我有一个实体Foo foo
,并尝试使用仓库fooRepository.save(foo)
来保存它。我的问题是,在保存后,我传递给save()
方法的foo
实例发生了变化。我不希望这种情况发生,并且很奇怪我找不到任何相关的问题。
这是预期的行为吗?
我注意到在spring-data的JpaRepository中,使用save(T entity)
方法时出现了非常奇怪的行为。
我有一个实体Foo foo
,并尝试使用仓库fooRepository.save(foo)
来保存它。我的问题是,在保存后,我传递给save()
方法的foo
实例发生了变化。我不希望这种情况发生,并且很奇怪我找不到任何相关的问题。
这是预期的行为吗?
这里可能的一个解释是,当您保存时,一些其他线程或进程也修改了基础实体。 这里是保存给定的实体。使用返回的实例进行进一步的操作,因为保存操作可能已完全更改了实体实例。
save()
方法实际执行的内容:@Transactional
@Override
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity); // <-- this is your use case
}
}
它将调用em.merge()
,这将返回数据库记录/实体中已进行的任何新底层更改。因此,您应该检查是否还有其他内容在后台更新此实体。
save()
可能已经改变了底层实体并不一定意味着你的代码就是在做这个改变。 - Tim Biegeleisenequals()
合同。例如,如果equals仅检查主键,则两个对象可能是“相等的”。 - Tim Biegeleisensave()
方法返回的实体实例和我传递给save()
方法的实例是相同的。但是只有在执行save
方法后它们才会相等,因为它会改变参数的状态。 - Sergii Bishyr