2012-04-01 4 views
0

Wenn ich eine Testmethode als @Transactional markiert habe und eine Entity zu einem beliebigen Zeitpunkt in der DB speichere, sollte ich die neuen Sachen abrufen können (mit Änderungen) in der nächsten Codezeile, auch wenn die Transaktion dann zurückgesetzt wird (das Standardverhalten von Transaktionseinheitstests), richtig?Sicherstellen, dass die Hibernate-Persistenz an einem Junit-Test arbeitete

Mit anderen Worten, wenn ich folgendes:

thisPhoto.likes.add(thisUser); 
thisPhoto.save(); //the hibernate session will save this instance 
... 
thisUser = User.get(thisUser.id) // I even take the user instance again 
newPhoto = thisUser.likedPhotos.get(0); //this should already contain the new photo, right? 
assertEqual(newPhoto, thisPhoto); 

Stellen Sie sich das Foto und Benutzer sind beide Hibernate basierte Einheiten, wo alle Beziehungen richtig eingestellt sind und alles.

Dennoch, als ich die letzte Zeile des Codes zu erreichen, erhalte ich eine Ausnahme, dass die likedPhotos Sammlung Größe von 0, und es gibt kein Element bei Index 0.

Warum? Wie soll ich sonst testen, dass die Entität richtig erhalten wurde?

Antwort

0

save wird nicht sofort gespeichert. Sie müssen flush die Sitzung, um sicherzustellen, dass die Änderungen tatsächlich in der Datenbank erhalten bleiben.

+0

eigentlich will ich nicht einmal, dass es die DB erreicht. Ich vertraue Hibernate dafür. Was ich tatsächlich erwartet habe, wäre, dass ich bei der Suche nach der (bereits aktualisierten) Entität die aktuelle Sitzung mir eine aktualisierte gegeben hätte, auch wenn die Änderungen noch nicht in der DB gespeichert wurden. Ich glaube, ich liege etwas falsch, oder? – preslavrachev

+0

tatsächlich, auch manuell die Sitzung entleeren und dann das Objekt neu zu laden gibt keine aktualisierte :( – preslavrachev

+0

verwenden Sie mysql? Haben Sie die Autocommit auf? – hvgotcodes

0

Zunächst sollten Sie eine Liste, die zu Photo gehört, nicht direkt behandeln, ohne Photo.getLikes() aufzurufen. Das wird in den meisten Fällen als objektorientierter Stil angesehen.

Zweitens ist es für die meisten Domänenobjekte ziemlich normal, die Bearbeitung seiner Sammlungen überhaupt nicht zuzulassen. Sie sollten Photo fragen, um seine Liste so zu aktualisieren: Photo.addLikedUser(User). Dann können Sie Ihre Liste für die Bearbeitung sperren, indem Sie Collections.unmodifiableSet(this.likes) in der Photo.getLikes() Methode zurückgeben.

Schließlich, um Ihr Problem zu lösen, müssen Sie wahrscheinlich User.addLikedPhoto(Photo) in Ihrer Photo.addLikedUser(User) Methode aufrufen. Ich bin mir nicht sicher, ob Hibernate das für Sie tun wird, besonders bevor Sie flush aufrufen.

Verwandte Themen