| 

.NET C# Java Javascript Exception

Rückgabewerte bei INSERTs in die Zwischentabellen von m:n Relationen

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


Rückgabewerte bei INSERTs in die Zwischentabellen von m:n Relationen

limepix - 10.05.2010 11:12
So... nächstes Problem :-)

Vorweg: Ich benutze postgres8.4 als Datenbank...
Also - Ich habe zwei Domainklassen, die in einer m:n Beziehung zueinander stehen. In der Datenbank schaut es aber nicht so aus, dass ich Tabelle A, Tabelle B und Tabelle A_B habe, sondern, in der Tabelle A gibt es ein Integer Array (B_IDS), mit den PRIMARY KEYS der Tabelle B. (Die Datenbankstruktur existierte so bereits schon)
In Grails kann man das so umgehen, dass man die Zwischentabelle nur vortäuscht und sie nicht von GORM/Hibernate anlegen lässt.
SQL dazu:

Language: SQL
CREATE OR REPLACE VIEW A_B AS SELECT A_ID, unnest(B_IDS) AS B_ID FROM A ORDER BY A_ID;

Im mapping meiner Domain Klassen lege ich nun über "joinTable" fest, dass die View als Zwischentabelle benutzt werden soll. Das funktioniert soweit auch ohne Probleme, allerdings nur für lesende Zugriffe (SELECTs).
Wenn ich nun aber noch die Funktionalität der UPDATES und INSERTS haben möchte, wird´s schon etwas kniffliger.

In postgres kann man auch für VIEWS Trigger, bzw Regeln definieren. Das bedeutet, wenn ich auf der View ein INSERT aufrufe, kann ich genau bestimmen was passieren soll.
SQL dazu:

Language: SQL
CREATE OR REPLACE RULE A_B_ins AS ON INSERT TO A_B DO INSTEAD UPDATE A SET B_IDS = array_append(B_IDS, NEW.B_ID) WHERE A_ID = NEW.A_ID;

Wenn ich das nun mittels eines kleinen Skriptes teste:

Language: Groovy
def a = A.get(1) def b = B.get(1)   a.addToBs(b)


, bekomme ich folgenden Fehler:

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

Das lies mich nun darauf schliessen, dass ein INSERT wohl auch immer einen Wert zurück liefert. Vermutlich die ID der eingefügten row. Ich mache allerdings kein INSERT, sondern ein UPDATE. Ich kann die Regel zwar so definieren, dass sie mir auch etwas zurück liefert, allerdings bleibt die Fehlermeldung die selbe... :-(

EDIT: Die Daten stehen aber drin, also eingefügt sind sie! Nur kommt Hibernate anscheinend nicht mit dem Rückgabewert zurecht...

(Ein Versuch die Regel anzupassen war folgender:
Language: SQL
CREATE OR REPLACE RULE A_B_ins AS ON INSERT TO A_B DO INSTEAD UPDATE A SET B_IDS = array_append(B_IDS, NEW.B_ID) WHERE A_ID = NEW.A_ID RETURNING NEW.A_ID, NEW.B_ID;
, leider hat aber auch das nichts gebracht... )

Ich bin für alle Art von Lösungsvorschlägen sehr dankbar

Grüße
limepix


Re: Rückgabewerte bei INSERTs in die Zwischentabellen von m:n Relationen

koeberle - 10.05.2010 15:03
Wenn ich deine Fehlermeldung richtig interpretiere:
org.hibernate.StaleStateException: 
Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
Dann würde ich in das SQL am Ende RETURNING 1 schreiben. Es sieht doch so aus als ob Hibernate nur wisse möchte auf wie vielen Zeilen ein Update gelaufen ist.

Christian


Re: Rückgabewerte bei INSERTs in die Zwischentabellen von m:n Relationen

limepix - 10.05.2010 15:29
Fast. Ja....

In der Regel muss einfach ein zweites Statement definiert werden, welches folgendermaßen aussieht:

Language: SQL
CREATE OR REPLACE RULE A_B_ins AS ON INSERT TO A_B DO INSTEAD( UPDATE A SET B_IDS = array_append(B_IDS, NEW.B_ID) WHERE A_ID = NEW.A_ID; SELECT NEW.A_ID; --bzw. SELECT 1::bigint; )


Darauf bin ich über diesen Beitrag hier gestossen: click


Die Fehlermeldung bleibt allerdings die gleiche.
Nächste Vermutung: Es wird versucht aus der View heraus, die aktualisierte Anzahl an Columns festzustellen ("Wie viele habe ich ge-updated??"). Da die View aber erst nachträglich durch die unnest Funktion aktualisiert wird, kommt es zu timing Problemen.

??


Re: Rückgabewerte bei INSERTs in die Zwischentabellen von m:n Relationen

limepix - 11.05.2010 10:15
Tatsächlich!

Ein einfacher INSERT in eine dummy Tabelle reicht aus...

Dankeschön!


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "Rückgabewerte bei INSERTs in die Zwischentabellen von m:n Relationen" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.