4

是否有可能(不编写自定义 SQL)让 Eclipselink 信任我是否在合并时执行更新或插入,而不是执行选择,然后执行更新或插入?如果是这样,怎么做?

在我看来,我想使用一个临时标志和一个自定义 if 语句来确定该项目是否已经在数据库中,并指示 eclipselink 执行所需的查询。我了解 Hibernate 将其提供为 update() 和 save()

几个值得注意的点:

  • 我有大量正在批量合并的对象,因此persist() 不适合我(这些对象也不存在于库中,除非它们被传入以进行合并)
  • 因为要合并的对象太多,不太可能有任何缓存命中,所以eclipselink一直无法判断它之前是否通过缓存发送过
  • 因为进入(在这种情况下是非本地数据库)的对象数量是一个问题,特别是考虑到我可以在操作发生之前知道哪些是需要的
  • 我真的不想切换到 Hibernate

谢谢。也许我错过了一些明显的东西!

4

1 回答 1

5

您正在寻找的是 EclipseLink 中的存在检查,并且可以使用 @ExistenceChecking 注释进行配置,如下所述:http: //eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_existencechecking.htm

尝试指定 @ExistenceChecking(ExistenceType.CHECK_CACHE) ,因为它声明 check_cache 是默认值,这适用于 Native EclipseLink 项目。JPA 项目使用 Check_Database 作为默认值以符合 JPA 规范,该规范要求合并调用在必要时合并到数据库中的数据中。使用 check_cache 将完全阻止 EclipseLink 进行查询,因此您可以根据自己的条件进行查询。但是,现有对象将需要在缓存中,否则没有可合并的内容,EclipseLink 将不得不执行插入。

另一种选择是使用定制器来定义用于每个类的 DoesExistQuery。这可以让您覆盖 checkEarlyReturn 方法以根据需要执行以确定存在。

上述选项仍然使用 JPA 合并,因此仍然需要获取现有数据以合并到 - 因此它仍然需要选择不在缓存中的现有对象。如果您所追求的只是更新所有类型的语句,它将更新对象或按原样插入对象,而不只跟踪已更改的内容,您可以尝试查看原生 EclipseLink 功能,例如 UnitOfWork api。使用 ((EntityManagerImpl)em.getDelegate()).getUnitOfWork().updateObject(entity) 之类的东西或使用 UOW 执行您自己的 UpdateObjectQuery 将避免选择现有对象,而只会丢失发送更改。

于 2013-11-13T13:52:03.107 回答