Ich habe eine Klasse:SEAM/Hibernate: Ich kann nicht Änderungen von Datenbank während eines Gesprächs
@Name("foo")
@Scope(ScopeType.CONVERSATION)
public class Foo {
@In
Session session;
@In
private Conversation conversation;
@RequestParameter
Long barId;
/* outjected fields */
@Out
Bar bar;
/* some attributes and methods */
public void start() {
/* some initializations */
this.bar = (Bar) session.get(Bar.class, barId);
}
public void end() {
/* some actions involving bar and bar.getBaz() */
conversation.end();
}
}
Die Methode start() zu Beginn des Gesprächs aufgerufen und initialisiert das Attribut bar (Bar ist eine Entitätsklasse). Dann hat bar ein Attribut baz, das auch eine Entität ist.
Während einer Konversation kann es vorkommen, dass ein anderer Benutzer das Baz-Objekt in Bezug auf unsere Leiste ändert. Wenn dann end() aufgerufen wird, gibt bar.getBaz() die alte (unmodifizierte) Version von baz zurück, und überschreibt es in der Datenbank.
Ich habe versucht, den geänderten Zustand von Baz in der end() -Methode mit session.flush(), session.merge (bar), session.merge (bar.getBaz()), aber nichts funktioniert. Wie kann ich Verschmutzung in der Datenbank vermeiden?
Danke! session.refresh (bar.getBaz()) hat funktioniert! Ich konnte @Version nicht verwenden, da sich die Anwendung bereits im Produktionszustand befindet und das Datenbankschema nicht geändert werden kann. – janek37