是否值得使用 Hibernate Bytecode Enhancement 机制?

Sve*_* M. 8 java orm hibernate lazy-loading byte-code-enhancement

我目前正在阅读 Vlad Mihalcea 的书High-Performance 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>
Run Code Online (Sandbox Code Playgroud)

在进一步研究 Hibernate 文档时,我发现了另外三个属性:

  • enableLazyInitialization,
  • enableAssociationManagement,
  • enableExtendedEnhancement.

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

如果我理解正确,是否enableAssociationManagement使双向关系的独立处理变得多余并替换enableLazyInitializationenableDirtyTracking反射?

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

Vla*_*cea 12

enableAssociationManagement只从父母工作到子实体,而不是周围的其他方法。所以,它不是很有用。使用添加/删除方法更好地同步双向关联的两端。

enableLazyInitialization可以是用于懒惰属性是有用的,像取母体侧@OneToOne懒惰地关联,如通过默认,这个人是取出热切即使当设置为FetchType.LAZY

enableDirtyTracking如果您确保 Persistence Context 永远不会加载太多实体,则不需要该设置。与使用此设置相比,您最好减少 Persistence Context 的大小。

enableExtendedEnhancement设置允许您扩展比实体类更多的内容,因此字节码增强甚至可以超越对实体调用 getter 和 setter。不推荐此设置。