2010-11-28 3 views
2

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?

Antwort

1

Entschuldigung, dass ich nicht mit einer ausführlichen Antwort kommen kann. Ich musste Entitäten von der DB neu laden, die von einem anderen Serverlet modifiziert wurden. Ich tat dies, indem ich die Methode refresh() von JPA verwendete. Eine Hibernate-Sitzung bietet auch die Methode. Sie können auch die @Version Annotation für optimistisches Sperren in Betracht ziehen.

+0

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

Verwandte Themen