Frage

ich benutze:

  • EJB3 / JPA (Hibernate)
  • MySQL 5

Ich habe ein System einzurichten, um Datenbankmigrationen zu helfen. Versuchte Liquibase zu verwenden, aber es ist nicht reif genug, scheint noch mit Hibernate verwendet werden.

Was würde Ich mag zu tun ist:

  • Ich habe die Version 1.0 der Anwendung in der Produktion
  • Ich habe die Version 2.0 der Anwendung entwickelt und getestet
  • Ich mag die Anwendungsdatenbank in der Produktion aktualisieren, ohne Daten zu verlieren

Eigentlich würde Ich mag die neuen persistence.xml und die Produktionsdatenbank verwenden, um die Lage sein, das „Delta“ zwischen der alten Datenbank und den neuen zu generieren. Ich möchte in der Lage sein, den SQL-Code abzurufen, die ausgeführt wird, wenn hbm2ddl ist auf „Update“ -Modus.

Dieser Code SQL geändert werden (drop + erstellen = umbenennen etc ...) der Verlust von Daten zu vermeiden, die mit hbm2ddl.auto=update passieren könnten.

Ich denke, es ist möglich, weil Hibernate es tut, wenn eine neue Version mit hbm2ddl.auto=update bereitstellen. Aber ich will in der Lage sein mit hibernatetool es in einer Ant-Task zu tun.

Ich finde nicht viele Informationen über diese im Internet, so dass ich frage mich, ob jemand schon so etwas wie das hier getan und mir helfen könnte.

Ich habe getan, die folgenden:

<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>

Ich weiß wirklich nicht, wie zu tun, ich war in der Lage die Schaffung SQL-Datei zu bekommen, aber ich will nur das Delta. Ich habe Update setzen = „true“? Kann ich die jpaconfig mit Persistenzeinheit außerhalb des Anwendungsservers verwenden (die db-Einstellungen werden auf JNDI Ressource auf Glassfish gesetzt). (Versucht, und es kann einfach nicht die db finden)

Ich habe auch versucht mit <jdbcconfiguration propertyfile="hibtest.properties"></jdbcconfiguration> oder festigenden Eigenschaften der Datenbank in persistence.xml statt JNDI Ressource verwendet wird.

Ich habe folgende Fehlermeldung:

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

Ich verwende MySQL, und meine JDBC Eigenschaften sind:

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

Mein JDBC MySQL-Treiber ist in ${core.lib.server}: mysql-connector-java-5.1.7-bin.jar. (Ich habe auch versucht in Classpath <fileset dir="/home/slorber/workspace/core/lib/server" includes="*.jar" /> zu setzen.)

Ich habe es auch auf die Ausführungskonfiguration Classpath von Ant (Eclipse-Plugin).

Also meine Fragen sind:

  • Habe ich etwas falsch gemacht zu tun, was ich will?
  • Ist das so, wie Sie mit einem Hibernate Rahmen ein db migrieren tun würde? (Und was würden Sie tun, wenn nicht alle db Änderungen in der Hand-made SQL-Dateien zu schreiben?)
War es hilfreich?

Lösung

Hbm2ddl hat eine API haben Sie selbst anrufen können. Wenn die vorhandenen Ameise Aufgaben nicht tun, was Sie wollen, können Sie immer die hbm2ddl machen nennt sich, möglicherweise vorbei sogar einen überladenen JDBC-Treiber überwintern, die tatsächlich protokolliert Anweisungen ausführen, anstatt sie ausführt oder eine Überlastung der hbm2ddl Methoden ausführen.

Ich möchte auch hinzufügen, dass Sie bei Verwendung liquibase und Erstellen von XML-Dateien manuell über jede Art von diffs aussehen sollte. Sie erkennen, dass Sie, dass die generierte SQL korrekt ist müssen bestätigen, es ist genauso einfach es einen Schritt zu einer Zeit, zu erstellen, wie Sie entwickeln, und dann wissen Sie, es richtig ist.

Wir verwenden Hibernate, und anstatt die Integration liquibase Hibernate, wir Hibernate Mappings aktualisieren, unsere Integrationstests laufen, um zu sehen, dass sie versagen, schaffen die notwendige liquibase changeset (Tabelle hinzufügen, fügen Sie Spalte, umbenennen Spalte, etc.) erneut ausführen, dann die Tests und sehen, wie sie passieren. Aufbau des Changelogs Schritt für Schritt arbeitet gut mit dem regelmäßigen Rhythmus der Entwicklung ohne Rückgriff auf alles über Plausibilitätsprüfungen diffs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top