2016-03-25 20 views
1

hibernate-tools hbm2ddlタスクを呼び出して、注釈付きクラスからデータベーススキーマを生成するためのグラデーションプラグインや他の方法があります。ただし、一部の設定ファイルにすべてのエンティティ(@Entity)彼らはクラスパスで発見?gradleからhbm2ddlを呼び出す

好ましくはHibernate 5のために、しかしHibernate 4も同様です。

答えて

0

最後に、persistence.xmlファイルを移動させることで実現しました。

私のシナリオでは、ライブラリエンティティと、スキーマを生成するアプリケーションエンティティがあります。どうやら、ライブラリエンティティをpersistence.xmlにリストする必要があります。これは頻繁に変更されないので問題ありませんが、アプリケーションエンティティを永続化ファイルにリストしないでクラスパスから取得するためには、クラスとpersistence.xmlファイルの両方が同じクラスローダーによって読み込まれました(私は推測します)。

これは機能します。

ライブラリの実体:表MyCustomer、MyInvoice

アプリケーションエンティティ:のMyBook、

/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 MyBooking:

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/" 
} 

結果は、MyCustomer、MyInvoice、Myのテーブルを持つddlです。 MyBookとMyBookingがどこにもリストされていなくても、設定に触れることなく追加または削除することができます。

ここで、persistence.xmlファイルをresourcesフォルダからclassesフォルダにコピーする方法があります。

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

が、これを行うことが発見されてから、アプリケーション・エンティティを防ぐことができます:あなたはこれを行わない場合 は、持っているために、それはあなたのようなものでhibtools構成にリソースのパスを追加する必要がありました。

これはHibernate 4で動作します。現在のHibernate 5アルファツールを使用すると、空のddlファイルが得られます。

関連する問題