Вызов hbm2ddl из Gradle

Существует ли плагин gradle или любые другие способы вызова задачи hibernate-tools hbm2ddl для генерации схемы базы данных из аннотированных классов, без необходимости перечислять все сущности (@Entity) в каком-либо файле конфигурации, но обнаруживать их в пути к классам?

Предпочтительно для Hibernate 5, но Hibernate 4 тоже подойдет.

1 ответ

Я наконец сделал это, переместив файл persistence.xml.

В моем сценарии у меня есть несколько библиотечных сущностей и некоторые прикладные сущности, для которых я хочу сгенерировать схему. По-видимому, мне нужно перечислить объекты библиотеки в файле persistence.xml, что хорошо, так как они меняются не часто, но для того, чтобы объекты приложения можно было выбирать из пути к классам, не перечисляя их в файле постоянства, я должен был убедиться, что и классы, и файл persistence.xml были загружены одним и тем же загрузчиком классов (я полагаю).

Это то, что работает.

Объекты библиотеки: MyCustomer, MyInvoice

Объекты приложения: MyBook, MyBooking

/src/main/resources/META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">

   <persistence-unit name="defaultPersistenceUnit">
        <!-- List the library classes only -->
        <class>net.mylibrary.entity.MyCustomer</class>
        <class>net.mylibrary.entity.MyInvoice</class>

      <properties>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.username" value="myusr"/>
            <property name="hibernate.connection.password" value="mypwd"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost/mydb"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
      </properties>
   </persistence-unit>
</persistence>

build.gradle:

apply plugin: 'war'
apply plugin: 'eclipse-wtp'

repositories {
    jcenter()
    mavenLocal()
}

dependencies {
    compile ... my project dependencies ...
}

configurations {
    hibtools
}

dependencies {
    hibtools 'net.mylibrary:MyEntities:1.0' // Library for MyCustomer and MyInvoice
    hibtools 'org.hibernate:hibernate-tools:4.+',
        'mysql:mysql-connector-java:5.+'
    hibtools files("$buildDir/classes/main") // MyBook and MyBooking
}

task createSchema(dependsOn: ['build', 'copyPersistenceUnit']) << {     
    ant.taskdef(name: 'hibernatetool',
            classname: 'org.hibernate.tool.ant.HibernateToolTask',
            classpath: configurations.hibtools.asPath)
    ant.hibernatetool(destdir: 'schema') {
        ant.jpaconfiguration(persistenceunit: 'defaultPersistenceUnit')
        ant.hbm2ddl(drop: 'false', export: 'false', outputfilename: 'mydb.sql')
    }
}

task copyPersistenceUnit(type: Copy) {
    from "$buildDir/resources/main/META-INF/persistence.xml"
    into "$buildDir/classes/main/META-INF/"
}

Результатом является ddl с таблицами для MyCustomer, MyInvoice, MyBook, MyBooking, даже если MyBook и MyBooking нигде не перечислены и могут быть добавлены или удалены без касания конфигурации.

Хитрость заключается в том, чтобы скопировать файл persistence.xml из папки ресурсов в папку классов. Если вы этого не сделаете, для того, чтобы он был найден, вам нужно добавить путь к ресурсам в конфигурацию hibtools примерно так:

hibtools files(["$buildDir/resources/main", "$buildDir/classes/main"])

но при этом вы не сможете обнаружить сущности вашего приложения.

Это работает с Hibernate 4. Использование текущего альфа-инструмента Hibernate 5 дает пустой файл ddl.

Другие вопросы по тегам