是否可以(无需编写自定义SQL)让Eclipselink信任我是否在合并上执行更新或插入,而不是执行select,然后执行更新或插入?如果是这样,怎么样?
在我看来,我想使用瞬态标志和自定义if语句来确定该项是否已存在于数据库中,并指示eclipselink执行所需的查询。据我所知,Hibernate将其提供为update()和save()
一些值得注意的要点:
感谢。也许我错过了一些明显的东西!
答案 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将避免选择现有对象,而只丢失发送更改。