【问题标题】:How to setup Hibernate Gradle plugin for bytecode enhancement?如何设置 Hibernate Gradle 插件以增强字节码?
【发布时间】:2016-06-03 18:56:04
【问题描述】:

Hibernate Gradle 插件相当于hibernate-enhance-maven-plugin,并提供构建时代码增强功能。 official docs 没有提到 apply plugin: 'something' 行。如果我按照指南所说的那样做:

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

我尝试用apply plugin: 'enhance'this thread 建议)和apply plugin: 'org.hibernate.orm'this test 建议)猜测插件名称,但它只是说具有该 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,但没有任何有用的结果。

【问题讨论】:

    标签: hibernate gradle


    【解决方案1】:

    对于 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'
    }
    

    对于 Maven

    <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 会重新编译实体类并更改字节码like this

    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);
    }
    

    $$_ 方法是特定于 Hibernate 的,并且包含实体检测逻辑。

    【讨论】:

    • 嗨,hibernate-core,我需要:hibernate-entitymanagerhibernate-validatorhibernate-validator-annotation-processorhibernate-commons-annotationshibernate-jpa-2.1-apihibernate-ehcache 依赖项吗?
    • 那些依赖就像插件。它们提供额外的功能。
    • 谢谢弗拉德,我怎么知道我是否需要它们或hibernate-core 就足够了?
    • Hibernate User Guide 解释了每个模块的目标。喜欢阅读它,就像我喜欢写它一样。
    • 对于 Gradle 用户,请使用 implementation 而不是 compile,因为它是 @Depricated
    【解决方案2】:
    apply plugin: 'org.hibernate.orm'
    

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

    【讨论】:

    • 我实际上也试过这个,只是得到“带有 id 的插件...未找到”。您可能在我的 gradle.build 中看到任何错误配置的内容吗?在此期间,我会再试一次。
    • 你把apply plugin: 'org.hibernate.orm'放在build.gradle的什么位置?
    • 当且仅当我将整个插件配置放入子项目的 build.gradle 时它才有效。如果插件配置位于project(':xxx-model') 下的根 build.gradle 中,如问题中所示,则表示找不到插件。顺便说一句,我编辑了问题以显示我通常会将apply plugin: 'org.hibernate.orm'
    • 请注意,当hibernate.atlassian.net/browse/HHH-13354 被解析时,我们可以使用较新的插件语法。
    【解决方案3】:

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

    同时,插件的id名称是org.hibernate.orm,所以你要添加:

    apply: 'org.hibernate.orm'
    

    【讨论】:

      猜你喜欢
      • 2018-08-08
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 2021-11-03
      相关资源
      最近更新 更多