我目前正在阅读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之外。不建议使用此设置。