Hibernate und mysql mit create-drop-Option, Konsolenausgabe zeigt Fehler ... aber ddl ausgeführt ok; möglicher Fehler?

9

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?

    
NimChimpsky 03.01.2012, 15:25
quelle

3 Antworten

4

Das Problem ist das:

  • wenn Sie zwei Tabellen A und B und einen Fremdschlüsselverweis in A haben, der auf B verweist.
  • und Sie möchten die Tabellen löschen

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

übereinstimmt, auskommentiert (add alter table *. drop foreign key *.; am Anfang)

@Siehe Ссылка für weitere Details

    
Ralph 03.01.2012, 15:38
quelle
0

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.

Ссылка

    
user2560739 17.07.2013 20:34
quelle
0

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

    
George 08.05.2015 11:15
quelle

Tags und Links