Вызов 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.