spring-data JpaRepository save() 方法副作用

Ser*_*hyr 4 java spring hibernate jpa spring-data

我注意到save(T entity)spring-data JpaRepository 中有一个非常奇怪的行为。

我有实体Foo foo,我正在尝试使用 repository 保存它fooRepository.save(foo)。我的问题是,保存后foo,我传递给save()方法的实例已更改。我不指望这个,我很奇怪我找不到任何与它相关的问题。

这是预期的行为吗?

Tim*_*sen 6

我们可以通过首先检查CrudRepositoryJavadoc来尝试理解您的观察:

保存给定的实体。使用返回的实例进行进一步的操作,因为保存操作可能已经完全改变了实体实例。

一种可能的解释是,当您保存时,某个其他线程或进程也修改了底层实体。以下是该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
    }
}
Run Code Online (Sandbox Code Playgroud)

它将调用em.merge(),它将返回对数据库中的记录/实体所做的任何新的底层更改。因此,您应该检查看看还有什么可能在后台更新此实体。