2010-12-09 14 views
3

Ich habe eine Tabelle Benutzer, der viele untergeordnete Tabellen in User-Klasse unter der statischen hasMany Grails definiert hat.Grails GORM und MYSQL Kaskade löschen Problem

Ich habe kein Problem, wenn Sie User.get (3) .delete() in Grails tun. Dieser Benutzer und alle untergeordneten Tabellenzeilen werden automatisch gelöscht. Aber wenn ich die gleiche Operation in MySQL Workbench durchführen möchte. Ich erhalte einen Fehler von MySQL geworfen:

ERROR 1451: Cannot delete or update a parent row: a foreign key constraint fails (`test_db`.`search_stat`, CONSTRAINT `FK7A3CFFB6E64DB41` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)) 
SQL Statement: 
DELETE FROM `test_db`.`user` WHERE `id`='3' 

Ich weiß nicht, was ist das Problem hier mit MySQL.

+1

Überprüfen Sie die Definition der Tabelle in MySQL aus. Haben die Fremdschlüssel "ON DELETE CASCADE" oder ist GORM/Hibernate die Kaskade im Code hinter den Kulissen? –

+0

Ich habe das in der MYSQL-Workbench überprüft, aber auf der Registerkarte Foreing Keys werden keine Fremdschlüssel angezeigt. Foreing Key Names und Reference Table-Registerkarten darunter sind leer. Wenn ich auf das Leerzeichen klicke, wird automatisch fk_user_1 erstellt und auf die nächste Registerkarte geklickt. In einem Drop-down-Menü werden alle Tabellen in der Datenbank angezeigt, damit ich eine als referenzierte Tabelle auswählen kann. Aber ich denke, etwas stimmt nicht und ich sollte die Fremdschlüssel nicht neu erstellen müssen. Ich habe versucht, diese löschen commanind in der mysql-Befehlszeilenversion bekomme ich den gleichen Fehler ausgelöst. –

+0

Auf der anderen Seite sagt die Grails-GORM-Dokumentation eindeutig die Anglets an, um automatisch die Kaskade beim Lösch-/Aktualisierungsverhalten zu erstellen. Dieses Verhalten sollte also in das DB-Schema übernommen worden sein, als GORM Tabellen in MySQL db erstellt hat. –

Antwort

1

Wo haben Sie über die "ON DELETE CASCADE" in der Dokumentation gelesen? Ich habe es nicht gefunden here. Das Poster von this post musste dies manuell hinzufügen, um das gewünschte Verhalten zu erhalten.

Wenn Grails wirklich das hinzufügen soll, hast du versucht, die DB zu löschen und sie von Grails (zumindest in der Entwicklungsumgebung) neu zu erstellen? Vielleicht wurde das aktuelle Schema erstellt, bevor Sie das "objectsTo" oder etwas hinzugefügt haben?

Überprüfen Sie auch this Blog post about GORM Gotchas regarding hasMany and belongsTo.

+0

In der Dokumentation hier –

+0

http://www.grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html es deutlich sagt: Das Standard-Kaskadierungsverhalten ist zu kaskadieren speichert und aktualisiert, löscht aber nicht, es sei denn, es wird auch ein "antsTo" angegeben. –

+0

Ok, aber es heißt nicht, dass dies in SQL mit "ON DELETE CASCADE" "implementiert" wird, oder? Vielleicht ist es nur Grails Funktionalität, die Löschung mit separaten SQL-Anweisungen zu kaskadieren. –