-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: m:n-Beziehung - alle Zuordnungen löschen und neu anlegen
PostPosted: Tue Jan 15, 2008 11:45 am 
Newbie

Joined: Wed Nov 02, 2005 11:00 am
Posts: 12
Location: Austria, Vienna
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


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jan 16, 2008 4:26 pm 
Expert
Expert

Joined: Thu Jul 05, 2007 9:38 am
Posts: 287
Ja Hibernate sortiert die Statements um:
http://www.hibernate.org/hib_docs/v3/re ... e-flushing

Wenn du zwischen löschen und einfügen ein flush setzt, müsste es funktionieren.

Jens

PS: Hier steht, welchen Log Level du aktivieren musst, damit du die SQL-Statements siehst, die Hibernate absetzt.
http://www.hibernate.org/hib_docs/v3/re ... on-logging

_________________
Please rate useful posts.


Schauderhaft: Softwaredevelopment, Projectmanagement, Qualitymanagement and all things "schauderhaft"


Top
 Profile  
 
 Post subject: Flush funktioniert
PostPosted: Thu Jan 17, 2008 5:54 am 
Newbie

Joined: Wed Nov 02, 2005 11:00 am
Posts: 12
Location: Austria, Vienna
Hallo Jens,

Danke für den Tip.

Wir hatten zwar in einer Vorversion exakt dasselbe versucht ... also nach dem Delete und vor dem Insert ein Flush eingebaut.

Seltsamerweise hat genau das nicht funktioniert.

Jetzt haben wir's nochmals probiert ... und siehe da: keine Probleme ;-)

Wenn man sich diesen Teil der Doku durchliest, dann klingt's absolut logisch. Statements werden umgereiht, daher fkt. ohne Flush nicht. Durch Flush setzt Hibernate die JDBC Statements ab. Damit werden innerhalb der Transaktion zuerst die DELETE Statements und erst danach die INSERT Statements abgesetzt.

Schönen Dank nochmals!

lg Rüdiger


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.