使用 Gradle 的 Hibernate 工具逆向工程

Hibernate Tools reverse engineering with Gradle

当我将 Eclipse 用作我的 IDE 时,我曾经使用 Hibernate 工具对数据库进行逆向工程以获取我的实体,并带有注释。

我最近转向了 IntelliJ IDEA,我认为它更好 IDE,但不幸的是没有 Hibernate Tools 的端口,所以我无法生成我的像我以前那样的实体。我知道 IntelliJ IDEA 有自己的逆向工程工具(可通过 Persistence->Generate Persistence Mapping->By Database Schema 访问),但我发现它有些问题,有时会生成完全错误的实体。

我知道 Hibernate Tools 也可以从 Ant 使用。 Gradle 也有办法使用它吗?

我设法使用了 Gradle 的 Hibernate 工具,这在很大程度上要感谢 this question

事实证明(我不知道)Gradle 确实能够调用 Ant 任务,因此可以使用预先存在的 Hibernate Tools Ant 任务对数据库进行逆向工程。

为此,需要有一个 hibernate.cfg.xml 文件,其中包含告诉 Ant 询问如何访问我们的数据库所需的配置。这是一个例子:

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        <property name="hibernate.connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="hibernate.connection.url">
            jdbc:mysql://localhost:3306/mydb
        </property>
        <property name="hibernate.connection.username">
            username
        </property>
        <property name="hibernate.connection.password">
            password
        </property>
    </session-factory>
</hibernate-configuration>

(IntelliJ 可能会抱怨这个文件,告诉它找不到驱动程序,但这没关系,因为它们将在执行期间由 Gradle 提供)

此配置文件将由从 Gradle 调用的 Ant 任务使用。我把它放在一个新的 db 文件夹中,在项目根目录中创建。

需要在build.gradle文件中添加以下内容:

configurations {
    reverseMap
}

dependencies {
    //...your other dependencies...
    reverseMap 'org.hibernate:hibernate-core:4.0.1.Final'
    reverseMap 'org.hibernate:hibernate-tools:4.0.1.Final'
    reverseMap 'org.slf4j:slf4j-simple:1.7.5'
    reverseMap 'mysql:mysql-connector-java:5.1.48'
}

project.ext {
    hibernateDestDir = file("$projectDir/src/main/java")
}

task reverseMap {
    outputs.dir hibernateDestDir
    doLast {
        hibernateDestDir.exists() || hibernateDestDir.mkdirs()
        ant {
            taskdef(
                name: 'hibernatetool',
                classname: 'org.hibernate.tool.ant.HibernateToolTask',
                classpath: configurations.reverseMap.asPath
            )
            hibernatetool(destdir: hibernateDestDir) {
                jdbcconfiguration(
                    configurationfile: "$projectDir/db/hibernate.cfg.xml",
                    packagename: "com.me.models"
                )
                hbm2java(
                    jdk5: true,
                    ejb3: true
                )
            }
        }
    }
}

此代码创建一个名为 reverseMap 的新配置,可用于声明 reverseMap 任务所需的依赖项(hibernate-corehibernate-toolslog4j 是必需的,而驱动程序应该是您的 DBMS 所需的驱动程序)。

reverseMap 代码调用Ant 任务,基本上遵循the official guide。感兴趣的部分是 hbm2java,这是实际的出口商。其余代码基本上是 Ant 任务和配置的粘合代码。

可以从命令行 (./gradlew reverseMap) 或 IntelliJ 调用 Gradle 任务。