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

21

我目前正在阅读Vlad Mihalcea的书籍《高性能Java持久化》

在字节码增强部分中,提到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

但是我在互联网上找不到更多相关信息。

如果我理解正确的话,enableAssociationManagement 可以替代独立处理双向关系,像 enableDirtyTracking 和 Reflections 一样替代 enableLazyInitialization

不幸的是,我没有找到任何关于 enableExtendedEnhancement 的信息。因此,我和上述问题一样。我应该使用它吗?或者有什么缺点吗?

1个回答

28

enableAssociationManagement仅适用于从父实体到子实体的关联,反之则无效。因此,它并不是非常有用。最好使用添加/删除方法来同步双向关联的两端。

enableLazyInitialization对于懒加载属性非常有用,例如延迟获取父侧的@OneToOne关联,因为默认情况下,即使将其设置为FetchType.LAZY,该关联也会被急切地获取。

如果确保持久化上下文(Persistence Context)不会加载太多实体,则不需要使用enableDirtyTracking设置。最好减少持久化上下文大小而不是使用此设置。

enableExtendedEnhancement设置允许您扩展超出对实体类调用getter和setter以外的范围,因此可以在字节码增强方面工作。不建议使用此设置。


非常感谢您的回答! - Sven M.
@VladMihalcea,当我尝试使用这个插件时,我发现没有选择特定的字节码提供程序和要增强的实体的能力。您能否解答这些问题? - SternK
2023年,当使用Spring Initiazr时,如果您的依赖包括_GraalVM_和_Spring Data JPA_,生成的脚手架将启用属性enableLazyInitializationenableDirtyTrackingenableAssociationManagement。在添加_add/remove_方法时,我遇到了这些设置的错误 :-(。我想我以后在启动新项目时都会禁用这些属性。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接