如何设置Hibernate Gradle插件以进行字节码增强



Hibernate Gradle插件相当于hibernate-enhance-maven-plugin,并提供构建时代码增强功能。官方文档没有提到apply plugin: 'something'行。如果我只是按照指南所说的去做,我会得到:

找不到参数的方法 hibernate() ...

我尝试用apply plugin: 'enhance'(如此线程建议)和apply plugin: 'org.hibernate.orm'(如此测试所建议的那样)猜测插件名称,但它只是说具有该 id 的插件是未知的。

有没有人设法成功设置此插件?

我的build.gradle如下:

allprojects {
    group 'xxx'
    version '1.0-SNAPSHOT'
}
subprojects {
    apply plugin: 'java'
    sourceCompatibility = 1.8
    repositories {
        mavenLocal()
        mavenCentral()
    }
    dependencies {
        ...
    }
}
project(':xxx-model') {
    buildscript {
       repositories {
           mavenLocal()
           mavenCentral()
       }
       dependencies {
           classpath "org.hibernate:hibernate-gradle-plugin:5.0.7.Final"
       }
    }
    apply plugin: 'org.hibernate.orm'
    hibernate {
        enhance {}
    }
}
... more unrelated project blocks here

尝试将buildscript{...}移入根部,allprojectssubprojects,但没有有用的结果。

对于 Gradle

一个完整的示例如下所示:

apply plugin: 'java'
repositories {
    mavenLocal()
    mavenCentral()
}
buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }
    dependencies {
        classpath "org.hibernate:hibernate-gradle-plugin:$hibernateVersion"
    }
}
apply plugin: 'org.hibernate.orm'
hibernate {
    enhance {
        enableLazyInitialization= true
        enableDirtyTracking = true
        enableAssociationManagement = true
    }
}
dependencies {
    compile 'org.hibernate:hibernate-core:$hibernateVersion'
}

对于马文

<plugin>
    <groupId>org.hibernate.orm.tooling</groupId>
    <artifactId>hibernate-enhance-maven-plugin</artifactId>
    <version>${hibernate.version}</version>
    <executions>
        <execution>
            <configuration>
                <enableLazyInitialization>true</enableLazyInitialization>
                <enableDirtyTracking>true</enableDirtyTracking>
                <enableAssociationManagement>true</enableAssociationManagement>
                <enableExtendedEnhancement>false</enableExtendedEnhancement>
            </configuration>
            <goals>
                <goal>enhance</goal>
            </goals>
        </execution>
    </executions>
</plugin>

设置增强插件后,Hibernate会重新编译实体类并更改字节码,如下所示:

public void setDetails(PostDetails details) {
    this.$$_hibernate_write_details(details);
}
 
public void $$_hibernate_write_details(PostDetails details) {
    if (!Objects.deepEquals(details, this.details)) {
        this.$$_hibernate_trackChange("details");
    }
 
    this.details = details;
}
public void $$_hibernate_trackChange(String property) {
    if (this.$$_hibernate_tracker == null) {
        this.$$_hibernate_tracker = new SimpleFieldTracker();
    }
 
    this.$$_hibernate_tracker.add(property);
}

$$_方法特定于休眠,并包含实体检测逻辑。

apply plugin: 'org.hibernate.orm'

插件代码表明您从测试中获得的内容是正确的。您可能缺少的是buildScript部分中的repositories部分,用于从中获取插件jar。

字节码增强的官方文档(从 5.1 开始)实际上是用户指南。 该文档仍然没有提到应用此插件,因为我们假设一些基本的 Gradle 知识来使用 Gradle ;) 但是,该用户指南部分最好也指定如何应用该插件(我在Jira中为此创建了一个问题)。

同时,插件 id 的名称是 org.hibernate.orm ,因此您需要添加:

apply: 'org.hibernate.orm'

最新更新