2016-03-25 8 views
1

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

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

ответ

0

Я, наконец, сделал это, перемещая файл 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, My Book, MyBooking, даже если MyBook и MyBooking нигде не указаны и могут быть добавлены или удалены, не касаясь конфигурации.

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

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

но делать это позволит предотвратить ваши объекты приложения от обнаружения.

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

 Смежные вопросы

  • Нет связанных вопросов^_^