JPA合并与持久性

phe*_*aal 66 java merge jpa entitymanager persist

到目前为止,我的偏好始终是使用EntityManager merge()来处理插入和更新.但我也注意到merge在update/insert之前执行了额外的select查询,以确保数据库中不存在记录.

现在我正在开发一个需要对数据库进行大量(批量)插入的项目.从性能的角度来看,在我绝对知道我总是在创建一个要保留的对象的新实例的场景中使用persist而不是merge是有意义的吗?

Ósc*_*pez 69

mergepersist足够的时候使用它并不是一个好主意- merge做了很多工作.之前已经在StackOverflow讨论了这个主题,本文详细解释了这些差异,并通过一些很好的流程图来说明问题.

  • 此“答案”相当于将问题标记为重复并将文章链接添加到此或重复的问题。 (2认同)

Pio*_*cki 9

persist()如果像你说的那样,我肯定会坚持下去:

(...)我绝对知道我总是创建一个新的对象实例来保持(...)

这就是这个方法的全部意义 - 它将在实体已经存在的情况下保护您(并将回滚您的事务).

  • 尽管捕获`RuntimeException`绝对不是一个好习惯(但我认为你的意思是'EntityExistsException`)我不会称它为通用*良好的编码实践*.这取决于您的要求.如果要求说明对象**必须保持**并且**必须不存在**才会发生此操作 - 我绝对不会尝试在捕获异常后进行合并.此外,如果您使用JTA实体管理器,则此时您的事务已标记为回滚. (7认同)
  • @phewataal http://docs.oracle.com/javaee/6/api/javax/persistence/EntityExistsException.html (2认同)
  • 我想当你在已经存在的实体上调用`persist`时,你会得到`EntityExistsException`,并且由于JPA实现者,这个事务将被回滚(不是因为它是运行时异常).换句话说 - 我认为**(不确定)即使您尝试/捕获此异常,tx仍将标记为回滚.`merge`永远不会抛出`EntityExistsException`. (2认同)