是否值得使用休眠字节码增强机制?

我目前正在阅读Vlad Mihalcea的《高性能Java Persistence》一书。

在字节码增强部分,据说可以通过替换反射来优化具有大量数据的性能。但我只是想知道是否有任何缺点?enableDirtyTracking

不幸的是,我找不到任何或只有非常旧的信息。

<plugin>
   <groupId>org.hibernate.orm.tooling</groupId>
   <artifactId>hibernate-enhance-maven-plugin</artifactId>
   <version>${hibernate.version}</version>
   <executions>
      <execution>
         <configuration>
            <failOnError>true</failOnError>
            <enableDirtyTracking>true</enableDirtyTracking>
            <enableLazyInitialization>false</enableLazyInitialization>
            <enableAssociationManagement>false</enableAssociationManagement>
            <enableExtendedEnhancement>false</enableExtendedEnhancement>
         </configuration>
         <goals>
            <goal>enhance</goal>
         </goals>
      </execution>
   </executions>
</plugin>

在Hibernate文档中进行进一步研究时,我遇到了另外三个属性:

  • enableLazyInitialization,
  • enableAssociationManagement,
  • enableExtendedEnhancement.

但是我在互联网上找不到太多关于它的信息。

如果我理解正确,就会使双向关系的独立处理变得多余,并像反射一样替换?enableAssociationManagementenableLazyInitializationenableDirtyTracking

不幸的是,我找不到有关.这就是为什么我有与上面相同的问题。我应该只使用它吗?或者由此产生了哪些缺点?enableExtendedEnhancement


答案 1

唯一的工作原理是从父实体到子实体,而不是相反。所以,它不是很有用。使用添加/删除方法更好地同步双向关联的两端。enableAssociationManagement

enableLazy初始化对于懒惰的属性非常有用,例如懒惰地获取父端关联,因为默认情况下,即使设置为 ,也会急切地获取此关联。@OneToOneFetchType.LAZY

如果确保持久性上下文永远不会加载太多实体,则不需要该设置。最好减小持久性上下文大小,而不是使用此设置。enableDirtyTracking

该设置允许您扩展比实体类更多的内容,因此字节码增强功能甚至可以超越在实体上调用 getter 和 setter。不建议使用此设置。enableExtendedEnhancement


答案 2

推荐