我正在使用Hibernate 4.3.6,我利用最新的Maven字节码增强功能来检测所有实体的自我肮脏意识.
我添加了maven插件:
<build>
<plugins>
<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId>
<executions>
<execution>
<phase>process-test-resources</phase>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
我看到我的实体正在增强:
@Entity
public class EnhancedOrderLine
implements ManagedEntity, PersistentAttributeInterceptable, SelfDirtinessTracker
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private Long number;
private String orderedBy;
private Date orderedOn;
@Transient
private transient PersistentAttributeInterceptor $$_hibernate_attributeInterceptor;
@Transient
private transient Set $$_hibernate_tracker;
@Transient
private transient CollectionTracker $$_hibernate_collectionTracker;
@Transient
private transient EntityEntry $$_hibernate_entityEntryHolder;
@Transient
private transient ManagedEntity $$_hibernate_previousManagedEntity;
@Transient
private transient ManagedEntity $$_hibernate_nextManagedEntity;
...
Run Code Online (Sandbox Code Playgroud)
在调试时,我正在检查org.hibernate.event.internal.DefaultFlushEntityEventListener#dirtyCheck方法:
if …Run Code Online (Sandbox Code Playgroud) 我正在试图勉强地将hibernate OneToOne关系工作.
我的设置是使用hibernate和Gradle的spring-data-jpa.
即使这是一个记录良好的问题/功能,并且有很多好的读取,我已经意识到他们中的大多数正在处理maven.
幸运的是,有一个Gradle插件可以用于这个特殊的原因,即使文档不是最好的,我发现这个帖子也处理相同的问题,它似乎是一个非常简单的解决方案.
在我实现了Gradle脚本中所需的更改之后,似乎hibernate仍然急切地加载了OneToOne关系,所以我尝试执行
./gradlew build
并注意到打印了以下消息:
跳过Hibernate字节码增强,因为没有启用任何功能
根据插件的源代码,当未启用增强功能时会显示此消息,而不是我正在使用的情况:
hibernate {
enhance {
enableLazyInitialization= true
enableDirtyTracking = true
enableAssociationManagement = true
enableExtendedEnhancement = true
}}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是有人让这个工作正常吗?如果是的话,请您指点一些教程/指南以实现它吗?我在集成测试中使用拦截器来验证hibernate正在使用的查询数以及监视sql日志.
我的gradle文件看起来像:
buildscript {
repositories { mavenCentral() }
dependencies {
classpath 'com.github.ben-manes:gradle-versions-plugin:+'
}
dependencies {
classpath "org.hibernate:hibernate-gradle-plugin:5.2.15.Final"
}
}
plugins {
id "io.spring.dependency-management" version "1.0.3.RELEASE"
}
ext { springBootVersion = '1.5.4.RELEASE' }
ext['flyway.version'] = '4.0.3'
apply plugin: 'java'
apply plugin: 'checkstyle'
apply plugin: 'findbugs'
apply …Run Code Online (Sandbox Code Playgroud) hibernate gradle spring-data-jpa spring-boot 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使双向关系的独立处理变得多余并替换enableLazyInitialization为enableDirtyTracking反射?
不幸的是,我找不到任何关于enableExtendedEnhancement. 这就是为什么我有与上述相同的问题。我应该只使用它吗?或者由此产生哪些缺点?
环境
我正在使用需要字节码检测的第三方库.执行字节码检测的工具需要一些描述文件,这些文件必须与编译的.class文件位于相同的文件夹结构中.这些文件只在编译时才需要.
问题
我以为gradle会将所有文件(资源和类)暂时放在同一个文件夹中,然后从该文件夹创建一个jar.但是在组装jar之前,gradle似乎有两个不同的资源和类文件位置.就像之前提到的第三方代码检测工具一样,需要在类文件结构中使用相同文件夹结构中的描述文件.
题
简单地说:我该如何解决这个问题?
思路
src/main/java.不是很"干净",但可能是一个解决方案.遗憾的是,gradle会忽略这些文件.我试图以某种方式包括它们,但还没有让它工作.