5 Stimmen

Erstellen von HSQL create table query from class

Ich habe ein viel genutztes Projekt, an dem ich gerade arbeite und das ich aktualisiere. Es gibt mehrere Stellen, an denen dieses Projekt installiert werden kann, und es ist nicht sicher, welche Version wo verwendet wird und auf welche Version man in der Zukunft aktualisiert werden könnte. Im Moment sind sie aber alle gleich.

Mein Problem rührt daher, dass es viele Änderungen an den Hibernate-Entity-Klassen geben könnte, und es muss einfach sein, auf eine neuere Version zu aktualisieren, ohne Probleme und ohne Verlust von Datenbankinhalten. Ersetzen Sie einfach WAR und starten Sie und es sollte sich selbst migrieren.

Meines Wissens ändert Hibernate keine Tabellen, es sei denn hibernate.hbm2ddl.auto=create die aber eigentlich alle Daten wegwirft?

Wenn der Spring-Kontext vollständig geladen ist, wird eine Bean ausgeführt, die die Datenbank auf die aktuelle Version migriert, indem sie alle Änderungen von VersionX zu VersionY durchgeht (die vorherige Version wird in der Datenbank gespeichert) und die Tabelle manuell ändert.

Es ist kein großes Problem, ein paar hart kodierte ALTER TABLE zu machen, um ein paar Spalten hinzuzufügen, aber wenn es darum geht, komplette neue Tabellen hinzuzufügen, fühlt es sich albern an, das alles schreiben zu müssen...

Meine Frage(n) ist/sind also folgende :

  • Gibt es eine Möglichkeit, eine Entitätsklasse und einen Dialekt an Hibernate zu senden Code zu senden und eine gültige SQL-Abfrage zur Erstellung einer Tabelle zurückzubekommen?

  • Noch besser wäre es, einen SQL-String für das Hinzufügen einer Spalte zu einer Tabelle zu erstellen, der dialektsicher ist.

Ich hoffe, dies ist keine dumme Frage und ich habe nicht etwas Offensichtliches übersehen, wenn es um Hibernate geht...

4voto

Dipesh Punkte 195

Haben Sie versucht

hibernate.hbm2ddl.auto=update

Es behält die gesamte Datenbank mit den Daten und fügt nur die Spalten und Tabellen hinzu, die Sie in der Entität geändert haben.

2voto

Janoz Punkte 953

Vielleicht sollten Sie einen anderen Ansatz versuchen. Anstatt ein Schema bei der Laufzeitaktualisierung zu generieren, erstellen Sie eines "von Hand" (dies könnte auf der Grundlage eines von Hibernate generierten Skripts geschehen).

Speichern Sie eine Versionsnummer in der Datenbank und erstellen Sie für jede neue Version ein Update-Skript. Jetzt müssen Sie nur noch feststellen, in welcher Version sich die Datenbank derzeit befindet, und nacheinander die erforderlichen Update-Skripte ausführen, um sie auf die aktuelle Version zu bringen.

Um es besonders robust zu machen, können Sie einen Unit-/Integrationstest erstellen, der jede mögliche Datenbankaktualisierung durchführt und die Integrität der resultierenden Datenbank überprüft.

Ich habe diese Methode für eine von mir entwickelte Anwendung verwendet und sie funktioniert einwandfrei. Ein weiteres Beispiel für eine Implementierung dieses Musters ist Android. Sie haben eine Upgrade-Methode in ihrer API

http://developer.Android.com/reference/Android/database/sqlite/SQLiteOpenHelper.html#onUpgrade(Android.database.sqlite.SQLiteDatabase, int, int)

2voto

Ian Roberts Punkte 117705

Ich glaube nicht, dass Sie dies vollständig automatisieren können. Hibernate verfügt über das hbm2ddl-Tool (verfügbar als Ant-Task oder Maven-Plugin), um die erforderlichen DDL-Anweisungen aus Ihrer Hibernate-Konfiguration zu generieren und eine leere Datenbank zu erstellen, aber mir sind keine Tools bekannt, die einen automatischen "Diff" zwischen zwei Versionen durchführen können. In jedem Fall ist es wahrscheinlich besser, wenn Sie den Vergleich sorgfältig von Hand durchführen, da nur Sie Ihr Objektmodell gut genug kennen, um die richtigen Standardwerte für neue Eigenschaften bestehender Entitäten usw. zu wählen.

Sobald Sie Ihre Diffs ausgearbeitet haben, können Sie ein Tool wie liquibase um sie zu verwalten und die Aktualisierungen beim Start der Anwendung tatsächlich auf die Datenbank anzuwenden.

2voto

siebz0r Punkte 16509

Verwenden Sie nicht die ddl von Hibernate, sie wirft Ihre Daten weg, wenn Sie migrieren wollen. Ich schlage vor, dass Sie einen Blick auf Liquibase werfen. Liquibase ist eine Versionskontrolle für Datenbanken. Sie arbeitet mit Changesets. Jedes Changeset kann manuell erstellt werden oder Sie können Liquibase Ihre Hibernate-Konfiguration lesen und ein Changeset generieren lassen.

Liquibase kann über Spring gestartet werden, so dass es sich gut in Ihr Projekt einfügen sollte ;-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X