Реверс-инжиниринг Hibernate Tools с Gradle

Когда я использовал Eclipse в качестве своей IDE, я использовал Hibernate Tools для обратного проектирования базы данных для получения моих сущностей с аннотациями.

Недавно я перешел на IntelliJ IDEA, которую считаю в целом лучшей IDE, но, к сожалению, для нее нет порта Hibernate Tools, поэтому я не могу генерировать свои объекты так, как раньше. Я знаю, что у IntelliJ IDEA есть собственный инструмент реверс-инжиниринга (тот, который доступен через Persistence->Generate Persistence Mapping->By Database Schema), но я обнаружил, что он несколько глючит, иногда создавая совершенно неправильные объекты.

Я знаю, что Hibernate Tools также можно использовать из Ant. Есть ли способ использовать его и из Gradle?


person gscaparrotti    schedule 10.02.2021    source источник


Ответы (1)


Мне удалось использовать Hibernate Tools из Gradle, во многом благодаря этот вопрос.

Оказывается (я этого не знал), 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 во время выполнения)

Этот файл конфигурации будет использоваться задачей Ant, вызываемой из Gradle. Я положил его в новую папку 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-core, hibernate-tools и log4j, а драйвер должен быть тем, который нужен для вашей СУБД).

Код reverseMap вызывает задачу Ant, в основном следуя официальному руководство. Интерес представляет hbm2java, фактический экспортер. Остальной код в основном представляет собой связующий код для задачи и конфигурации Ant.

Задачу Gradle можно вызвать либо из командной строки (./gradlew reverseMap), либо из IntelliJ.

person gscaparrotti    schedule 10.02.2021