在eclipselink中执行UPDATE而不选择SELECT

时间:2013-11-13 11:04:05

标签: jpa-2.0 eclipselink

是否可以(无需编写自定义SQL)让Eclipselink信任我是否在合并上执行更新或插入,而不是执行select,然后执行更新或插入?如果是这样,怎么样?

在我看来,我想使用瞬态标志和自定义if语句来确定该项是否已存在于数据库中,并指示eclipselink执行所需的查询。据我所知,Hibernate将其提供为update()和save()

一些值得注意的要点:

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

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

1 个答案:

答案 0 :(得分: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将避免选择现有对象,而只丢失发送更改。