问题与下面的问题基本相同:
JPA 级联持续存在并且对分离实体的引用会引发 PersistentObjectException。为什么?
我正在创建一个引用现有分离实体的新实体。现在,当我将此实体保存在我的 spring 数据存储库中时,会引发异常:
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist
如果我们查看 spring data JPA 源代码中的 save() 方法,我们会看到:
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
如果我们看 isNew() 在AbstractEntityInformation
public boolean isNew(T entity) {
return getId(entity) == null;
}
所以基本上,如果我 save() 一个新实体(id == null)
,spring data 将始终调用persist,因此这种情况总是会失败。
在向集合中添加新项目时,这似乎是一个非常典型的用例。
我该如何解决这个问题?
编辑1:
笔记:
此问题与如何保存引用 Spring JPA 中现有实体的新实体没有直接关系?. 详细说明假设您收到通过 http 创建新实体的请求。然后,您从请求中提取信息并创建您的实体和现有的引用实体。因此,它们将永远分离。