Hibernate 对使用load()获得的实体使用lock(LockModeType.OPTIMISTIC_FORCE_INCREMENT)是否有效?

Hibernate 对使用load()获得的实体使用lock(LockModeType.OPTIMISTIC_FORCE_INCREMENT)是否有效?,hibernate,jpa,jpa-2.1,hibernate-5.x,hibernate-5,Hibernate,Jpa,Jpa 2.1,Hibernate 5.x,Hibernate 5,我正在处理一个批量数据加载框架,它使用load(…)来获取对我们已知存在的实体的引用,这些实体将作为要创建的实体的父实体(必须在多对一属性中为这些新子实体设置)。从未对父级进行过任何(其他)更改。它本质上是不可变的后期创建 这样做是为了减少抓取并优化性能。除此之外,该框架的引擎非常小心地进行操作,以支持大型、未中断的JDBC批处理。在大多数情况下(非常接近100%),这些“父母”不会在同一个会话中获取或创建,因此,加载(…)的结果,据我所知,将是一种空壳 为了便于正确的乐观锁定,每次获得新的子级

我正在处理一个批量数据加载框架,它使用
load(…)
来获取对我们已知存在的实体的引用,这些实体将作为要创建的实体的父实体(必须在多对一属性中为这些新子实体设置)。从未对父级进行过任何(其他)更改。它本质上是不可变的后期创建

这样做是为了减少抓取并优化性能。除此之外,该框架的引擎非常小心地进行操作,以支持大型、未中断的JDBC批处理。在大多数情况下(非常接近100%),这些“父母”不会在同一个会话中获取或创建,因此,
加载(…)
的结果,据我所知,将是一种空壳

为了便于正确的乐观锁定,每次获得新的子级(或将其删除)时,都需要增加父级的版本。这可以使用
lock(parent,LockModeType.OPTIMISTIC\u FORCE\u INCREMENT)
方法完成。我想了解在这种情况下,这里实际会/需要发生什么

需要读取/获取父版本,以便于以后进行比较。但是,这可能比实际获取父级更便宜,也更优化。我想到的一些事情是,Hibernate可以大量读取这些版本,而不是逐个加载它们,甚至比实际获取的父实体更高效地存储/处理它们。以后的比较和增量也可以类似地进行优化。这是很多“可能”。。。但是会发生什么呢

  • 将休眠错误,因为实体是来自load()的空壳?
  • 它会使用默认映射指定的属性执行昂贵的获取吗(不幸的是,这里没有优化,这非常可怕)
  • 否则,重复调用lock()的代价有多高?我应该保护它,以便最多调用一次,而不是为添加到同一父级的数千个子级中的每一个子级调用它吗?如果父项也发生变化,是否会产生副作用(我知道我说过不会,但这种情况非常罕见,而且父项可能在同一事务中创建)

  • 有人能澄清一下吗?谢谢

    附加细节:我们使用字节码增强和字段访问,如果这改变了什么。