在eclipselink中执行UPDATE而不选择SELECT

Chr*_*ell 4 eclipselink jpa-2.0

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

在我看来,我想使用瞬态标志和自定义if语句来确定该项是否已经在数据库中,并指示eclipselink执行所需的查询.我理解Hibernate提供了这个作为update()和save()

一些值得注意的要点:

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

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

Chr*_*ris 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将避免选择现有对象,而只丢失发送更改.