JPA EntityManager合并异常

时间:2012-10-12 19:30:24

标签: jpa merge entitymanager

当存在具有相同主键的现有实体时,尝试将实体合并到数据库时,我得到primaryKeyUpdateDisallowed ValidationException

当然,当我执行TypedQuery并让实体管理器首先返回实体,更新适当的值,然后合并时,我不会得到异常。问题是这个过程太昂贵,资源方面。我需要能够简单地合并而不会产生异常。

有没有办法构建我们的实体类,以便我们可以覆盖记录,包括主键?或者其他一些解决问题的方法?

1 个答案:

答案 0 :(得分:0)

在JPA中,如果您愿意:

entityManager.merge(someEntity);

然后你必须先将someEntity从DB加载到entityManager持久化上下文中,然后通过“entityManager.detach(someEntity)”或通过清除持久化上下文分离。如果someEntity没有预先加载和分离,而是通过“new SomeEntity()”创建,那么merge()函数将确定您添加了一个新实体并执行一个非常类似于entityManager.persist的内部操作( someEntity)。在事务中刷新或提交数据时,它将生成一个SQL INSERT,它将与预先存在的PK冲突。

以下是JPA 2规范中的指定行为:


应用于实体X的合并操作的语义如下:

  • 如果X是一个分离的实体,则将X的状态复制到具有相同标识的预先存在的托管实体实例X'上,或者创建X的新托管副本X'。 < / LI>
  • 如果X是新的实体实例,则会创建一个新的托管实体实例X',并将X的状态复制到新的托管实体实例X'中。

&GT;问题是这个过程太昂贵,资源方面。我需要能够简单地合并而不会产生异常。

不应该是这种情况。从DB中检索实体或实体列表应该是有效的。可能您的查询可能会得到改善。您在查询中有“where”子句吗?刷新期间是否有很多实体级联(通过属性cascade = CascadeType.REFRESH / ALL对@OneToMany或@ManyToOne等关系)?你有一个非常复杂的继承层次结构与许多实体/表?如果您可以提供JPQL或条件查询,我确信问题很容易解决。 : - )