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

2020年9月4日 21点热度 0条评论

我目前正在阅读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>

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

  • enableLazyInitialization
  • enableAssociationManagement
  • enableExtendedEnhancement
  • 但是我在互联网上找不到很多。

    如果我正确理解,
    enableAssociationManagement将使双向关系的独立处理变得多余,并像
    enableLazyInitialization Reflections一样替换
    enableDirtyTracking

    不幸的是,我找不到关于
    enableExtendedEnhancement的任何信息。这就是为什么我有与上述相同的问题。我应该使用它吗?或由此带来的不利条件?

    解决方案如下:

    enableAssociationManagement仅适用于父实体到子实体,反之则不行。因此,它不是很有用。更好的synchronize both ends of a bidirectional association
    enableLazyInitialization可用于惰性属性,如this article中所述。

    如果您确保持久性上下文永远不会加载太多实体,则不需要enableDirtyTracking设置。与使用此设置相比,减少Persistence Context大小更好。
    enableExtendedEnhancement设置允许您扩展多个实体类,因此字节码增强甚至可以在实体上调用getter和setter之外。不建议使用此设置。