2009-07-17 13 views
2

私が使用:のDb移行 - Hibernateは/ JPA - hbm2ddl - 差分ツール

  • EJB3/JPA(Hibernateの)
  • のMySQL 5

私は、データベースを支援するシステムを設定する必要があります移行。 LiquiBaseを使用しようとしましたが、Hibernateで使用するにはまだ成熟していないようです。私がやりたい何

は次のとおりです。

  • 私はアプリケーションのバージョン2.0を持って生産
  • にアプリケーションのバージョン1.0を持っている私は、アプリケーションのデータベースを更新したい
  • を開発およびテストデータを失うことなく生産中

実際に私は新しい「persistence.xml」と本番データベースを使用して、「デルタ」を生成できるようにしたいと思います古いデータベースと新しいデータベース。私はhbm2ddlが "更新"モードになっているときに実行されるSQLコードを取得できるようにしたいと思います。

このSQLコードは、hbm2ddl.auto=updateで発生する可能性のあるデータの損失を防ぐために変更されます(drop + create = rename etc ...)。

hbm2ddl.auto=updateで新しいバージョンをデプロイするときにHibernateが実行するので、これは可能ですね。しかし、私はhibernatetoolとAntタスクでそれを行うことができるようにしたい。

私はインターネット上でこれに関する多くの情報を見つけることができないので、誰かがすでにここでそのようなことをしてくれて助けてくれるのだろうかと思います。

私は次のことをやった:

<hibernatetool destdir="${dist}"> 
      <!-- 
      <jdbcconfiguration propertyfile="hibtest.properties"></jdbcconfiguration> 
      --> 
      <jpaconfiguration persistenceunit="server-pu" /> 
      <classpath> 
       <fileset dir="${core.lib.server}" includes="*.jar" /> 
       <fileset dir="${core.lib.runtime}" includes="*.jar" /> 
       <fileset dir="${core.lib.build}" includes="*.jar" /> 
       <pathelement location="${core.class}" /> 
       <pathelement location="${core.etc}" /> 
      </classpath> 
      <hbm2ddl outputfilename="schema-delta.sql" format="true" 
       export="false" update="true" /> 
</hibernatetool> 

私は本当に方法がわからない、私は、作成SQLファイルを取得することができたが、私はちょうどデルタをしたいです。 私はupdate = "true"を入れる必要がありますか? アプリケーション・サーバーの外部にある永続性ユニットとともにjpaconfigを使用できますか(db設定はGlassfishのJNDI ressourceで設定されています)。 (試してみるとデータベースが見つかりません)

また、<jdbcconfiguration propertyfile="hibtest.properties"></jdbcconfiguration>で、またはpersistence.xmlでデータベースのプロパティを設定しようとしましたが、JNDIリソースを使用していませんでした。

私は、次のエラーました:私はMySQLを使用して、私のJDBCプロパティがある

BUILD FAILED 
/home/slorber/workspace/build/build.xml:899: org.hibernate.exception.JDBCConnectionException: Getting database metadata 
    at org.hibernate.tool.ant.HibernateToolTask.reportException(HibernateToolTask.java:226) 
    at org.hibernate.tool.ant.HibernateToolTask.execute(HibernateToolTask.java:189) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288) 
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:357) 
    at org.apache.tools.ant.Target.performTasks(Target.java:385) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329) 
    at org.apache.tools.ant.Project.executeTarget(Project.java:1298) 
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
    at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1181) 
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423) 
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137) 
Caused by: org.hibernate.exception.JDBCConnectionException: Getting database metadata 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97) 
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.getMetaData(AbstractMetaDataDialect.java:64) 
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.caseForSearch(AbstractMetaDataDialect.java:163) 
    at org.hibernate.cfg.reveng.dialect.JDBCMetaDataDialect.getTables(JDBCMetaDataDialect.java:22) 
    at org.hibernate.cfg.reveng.JDBCReader.processTables(JDBCReader.java:476) 
    at org.hibernate.cfg.reveng.JDBCReader.readDatabaseSchema(JDBCReader.java:74) 
    at org.hibernate.cfg.reveng.JDBCReader.readDatabaseSchema(JDBCReader.java:860) 
    at org.hibernate.cfg.JDBCBinder.readDatabaseSchema(JDBCBinder.java:115) 
    at org.hibernate.cfg.JDBCBinder.readFromDatabase(JDBCBinder.java:88) 
    at org.hibernate.cfg.JDBCMetaDataConfiguration.readFromJDBC(JDBCMetaDataConfiguration.java:42) 
    at org.hibernate.tool.ant.JDBCConfigurationTask.doConfiguration(JDBCConfigurationTask.java:81) 
    at org.hibernate.tool.ant.ConfigurationTask.getConfiguration(ConfigurationTask.java:55) 
    at org.hibernate.tool.ant.HibernateToolTask.getConfiguration(HibernateToolTask.java:302) 
    at org.hibernate.tool.ant.Hbm2DDLExporterTask.createExporter(Hbm2DDLExporterTask.java:51) 
    at org.hibernate.tool.ant.ExporterTask.execute(ExporterTask.java:39) 
    at org.hibernate.tool.ant.HibernateToolTask.execute(HibernateToolTask.java:186) 
    ... 15 more 
Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql:3306//localhost/db 
    at java.sql.DriverManager.getConnection(DriverManager.java:602) 
    at java.sql.DriverManager.getConnection(DriverManager.java:154) 
    at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133) 
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.getConnection(AbstractMetaDataDialect.java:122) 
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.getMetaData(AbstractMetaDataDialect.java:61) 
    ... 29 more 
--- Nested Exception --- 
org.hibernate.exception.JDBCConnectionException: Getting database metadata 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97) 
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.getMetaData(AbstractMetaDataDialect.java:64) 
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.caseForSearch(AbstractMetaDataDialect.java:163) 
    at org.hibernate.cfg.reveng.dialect.JDBCMetaDataDialect.getTables(JDBCMetaDataDialect.java:22) 
    at org.hibernate.cfg.reveng.JDBCReader.processTables(JDBCReader.java:476) 
    at org.hibernate.cfg.reveng.JDBCReader.readDatabaseSchema(JDBCReader.java:74) 
    at org.hibernate.cfg.reveng.JDBCReader.readDatabaseSchema(JDBCReader.java:860) 
    at org.hibernate.cfg.JDBCBinder.readDatabaseSchema(JDBCBinder.java:115) 
    at org.hibernate.cfg.JDBCBinder.readFromDatabase(JDBCBinder.java:88) 
    at org.hibernate.cfg.JDBCMetaDataConfiguration.readFromJDBC(JDBCMetaDataConfiguration.java:42) 
    at org.hibernate.tool.ant.JDBCConfigurationTask.doConfiguration(JDBCConfigurationTask.java:81) 
    at org.hibernate.tool.ant.ConfigurationTask.getConfiguration(ConfigurationTask.java:55) 
    at org.hibernate.tool.ant.HibernateToolTask.getConfiguration(HibernateToolTask.java:302) 
    at org.hibernate.tool.ant.Hbm2DDLExporterTask.createExporter(Hbm2DDLExporterTask.java:51) 
    at org.hibernate.tool.ant.ExporterTask.execute(ExporterTask.java:39) 
    at org.hibernate.tool.ant.HibernateToolTask.execute(HibernateToolTask.java:186) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288) 
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:357) 
    at org.apache.tools.ant.Target.performTasks(Target.java:385) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329) 
    at org.apache.tools.ant.Project.executeTarget(Project.java:1298) 
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
    at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1181) 
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423) 
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137) 
Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql:3306//localhost/db 
    at java.sql.DriverManager.getConnection(DriverManager.java:602) 
    at java.sql.DriverManager.getConnection(DriverManager.java:154) 
    at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133) 
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.getConnection(AbstractMetaDataDialect.java:122) 
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.getMetaData(AbstractMetaDataDialect.java:61) 
    ... 29 more 

を:

hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect 
hibernate.connection.driver_class=com.mysql.jdbc.Driver 
hibernate.connection.url=jdbc:mysql:3306//localhost/db 
hibernate.connection.username=root 
hibernate.connection.password=root 
hibernate.connection.show_sql=true 

マイJDBC MySQLドライバは${core.lib.server}: mysql-connector-java-5.1.7-bin.jarです。 (私もクラスパス<fileset dir="/home/slorber/workspace/core/lib/server" includes="*.jar" />に入れようとしました)

また、Ant(Eclipseプラグイン)の実行コンフィグレーションクラスパスに追加しました。

だから私の質問は以下のとおりです。

  • は、私が欲しいものを行うには何か間違ったことをしたのでしょうか。
  • これは、Hibernateフレームワークでデータベースを移行する方法ですか? (手作りのSQLファイルにすべてのDB変更を書き込まないと、あなたは何をしますか?)
+0

面白い、私の最も読んだスレッドの1つで、+1ではない:D –

答えて

2

Hbm2ddlにはあなた自身で呼び出すことのできるAPIがあります。既存のantタスクがあなたの望むことをしていない場合は、いつでもhbm2ddlの呼び出しを行うことができます。hbm2ddlの実行メソッドをオーバーロードするのではなく、実行ステートメントを記録するオーバーロードされたjdbcドライバをhibernateに渡すこともできます。

また、liquibaseを使用して任意の種類の差分ファイルを手動で作成する必要があります。あなたは、生成されたSQLが正しいことを検証する必要があることを認識しています。開発するときに一度に1ステップずつ作成するのと同じくらい簡単です。

私たちはhibernateを使用していますが、liiberase hibernateの統合を使うのではなく、私たちのhibernateのマッピングを更新し、失敗したことを知るために統合テストを実行し、必要なliquibaseチェンジセットを作成します(テーブルの追加、列の追加、 )、テストを再実行し、それらが合格するのを見ます。チェンジログを段階的に構築することは、健全性のチェックを超えて差分を利用することなく、規則的な開発リズムにうまくいきます。