Ich benutze die create-drop-Option für die Entwicklung, bei der Bereitstellung in MySQL-Datenbank (mit Hibernate 4) bekomme ich die folgende Ausgabe:
%Vor%Es scheint, dass es versucht, eine Tabelle zu ändern, bevor sie sie erstellt hat. Die Tabelle und FK wurden erfolgreich erstellt. Was verursacht die Fehlermeldung?
Das Problem ist das:
Sie müssen zuerst die Fremdschlüsseleinschränkung entfernen. (außer Sie kennen die richtige Reihenfolge und haben keine zirkulären Abhängigkeiten)
Sie entfernen normalerweise zuerst alle Constraints und dann die Tabellen.
Wenn eine Tabelle nicht existiert (weil sie neu ist), dann benutzen Sie drop table if exists
Aber unglücklicherweise my-sql als keine Anweisung, um einen forainkey nur zu entfernen, wenn die Tabelle existiert. Es ist also eher ein Mangel an Features als ein Bug.
Ich habe es gelöst, aber mein Setup ist anders.
Ich verwende Hibernate nur im Validierungsmodus und führe die Skripte aus, um die Datenbank manuell zu aktualisieren.
Die Skripte werden von hibernate org.hibernate.tool.hbm2ddl.SchemaExport
generiert. Dann nehme ich die generierte Datei, am Anfang set foreign_key_checks = 0;
und am Ende set foreign_key_checks = 1;
. Dann habe ich jede Zeile, die mit dem Muster --
alter table *. drop foreign key *.;
am Anfang)
@Siehe Ссылка für weitere Details
Als ich das tat, benutzte ich postgres als meine Datenbank, und das ist eine einfache Lösung. Was passiert, ist, dass diese Tabelle jedes Mal neu erstellt wird und alles, was zuvor in dieser Tabelle war, wird gelöscht. Um es zu beheben, gehen Sie in Ihre persistence.xml unter src / main / resources / META-INF dort innerhalb der Datei persistence.xml kommentieren Sie die Zeile, die
<property name="hibernate.hbm2ddl.auto" value="create"/>
In dieser Zeile werden jedes Mal alle Tabellen mit demselben Fremdschlüssel neu erstellt und alle Ihre Tabellen gelöscht und neu erstellt (alle Ihre Daten in der Datenbank gehen verloren), wenn Sie Ihren Tomcat / Jetty-Server neu starten. Wenn Sie es auskommentieren, wird es aufhören, die Datenbank neu zu erstellen, und die darin enthaltenen Daten bleiben dort.
Überprüfen Sie auch die Antwort in dieser ähnlichen Frage: Grails 2.4 und Hibernate4 Fehler mit Run-App
Für mich schien es so:
Es wird einfach ein Fehler protokolliert, weil die Tabelle, die es abzusetzen versucht, noch nicht existiert.