Hallo,
Ich hab' anscheinend ein grundsätzliches Verständnisproblem, vielleicht kann mir jemand auf die Sprünge helfen.
Wir haben eine User- und eine Role-Tabelle und dementsprechend eine UserRole-Join-Tabelle.
Weder in User noch in Role gibt es ein Cascade in den Mappings.
Wir haben eine Methode, die zu einem User 1-n Rollen zuordnet. Unser anscheinend naiver Ansatz:
Wir holen den User, per Getter alle zugehörigen UserRole-Objekte, löschen diese alle (per session.delete(userRole)), legen mit den übergebenen IDs der Rollen neue UserRole-Objekte (ohne Primary Key ... also detached) an (per session.save(userRole)) und machen danach ein Commit ... also alles innerhalb einer Transaktion.
So weit, so schlecht ... funktioniert nicht, da Hibernate das innerhalb einer Transaktion anscheinend nicht erlaubt, da er bei der Anlage der "neuen" UserRole-Objekte dann meckert, wenn diese idente Foreign Key IDs zu User und Role haben. Wenn diese also bereits zuvor existiert haben, auch wenn wir sie mit session.delete zu löschen versucht haben. Fehler ist dann das Verletzen von Unique Constraints (die ich auf die FKs der User und Role IDs gesetzt habe).
Heisst das, dass Hibernate u.U. das DELETE Statement nachlagert. Denn wenn die Statements in der Reihenfolge des Codes abgearbeitet würden, dann würde innerhalb einer Transaktion ein Löschen und ein Anlegen von "gleichlautenden" Datensätzen möglich sein.
Wenn ich in PostgreSQL z.B. folgendes mache:
begin;
delete from cms_db_user where pk_db_user_id = 1;
insert into cms_db_user values (1, 'z', 'y', 'x', 'w', 'v', 'u');
commit;
... dann funktioniert das problemlos, auch wenn bereits ein Datensatz mit der ID 1 vorhanden ist.
Kann mir jemand auf die Sprünge helfen? Danke!
Unsere Hibernate Version: 3.1.3
Rüdiger Engelberger
|