【发布时间】:2013-05-09 16:36:24
【问题描述】:
问题与下面的基本相同:
JPA cascade persist and references to detached entities throws PersistentObjectException. Why?
我正在创建一个引用现有分离实体的新实体。现在,当我将此实体保存在我的 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);
}
}
如果我们查看 AbstractEntityInformation 中的 isNew()
public boolean isNew(T entity) {
return getId(entity) == null;
}
所以基本上如果我保存()一个新实体(id == null),spring data 将始终调用persist,因此这种情况将始终失败。
这似乎是向集合添加新项目时非常典型的用例。
我该如何解决这个问题?
编辑 1:
注意:
此问题与How to save a new entity that refers existing entity in Spring JPA? 没有直接关系。详细说明假设您收到通过 http 创建新实体的请求。然后,您从请求中提取信息并创建您的实体和现有的引用实体。因此,它们将永远是分离的。
【问题讨论】:
-
卡在相同的场景中.. 有什么解决方案吗?
-
不,不是真的...当然你可以处理异常,然后先创建(持久化)新对象,并在持久化新对象后添加引用。但这并不适用于所有情况......
-
另一种选择是确定我们是否处于这种情况:
entity.getId() == null && entity.getReferencedEntity().getId() != null,如果为真,则从数据库中加载引用的实体。 -
这似乎是 Spring JPA 的基本失败。仅仅因为您保存的实体是新的,它不应该暗示
persist()将适用于其所有引用的实体...
标签: java merge spring-data spring-data-jpa persist