2010-11-28 120 views
2

期間我無法從數據庫的變化我有一個類:SEAM /休眠:一個會話

@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(); 
    }   
} 

的方法start()被稱爲在對話的開始和初始化屬性欄(欄是一些實體類)。然後,bar有一個屬性baz,它也是一個實體。

在對話過程中,可能會發生其他用戶修改與我們的酒吧相關的baz對象。然後,當調用end()時,bar.getBaz()返回舊的(未修改)版本的baz,此外,將其覆蓋它到數據庫。

我試圖使用session.flush(),session.merge(bar),session.merge(bar.getBaz())在end()方法中獲得baz的修改狀態,但沒有任何效果。我怎樣才能避免數據庫中的污染?

回答

1

對不起,我無法用精心設計的答案。我不得不重新加載數據庫中由另一個服務器修改的實體。我通過使用JPA的refresh()方法做到了這一點。 Hibernate會話還提供了refresh()方法。您可能還想要考慮@Version註解以進行樂觀鎖定。

+0

謝謝! session.refresh(bar.getBaz())工作!我無法使用@Version,因爲應用程序已處於生產狀態,並且數據庫架構無法更改。 – janek37 2010-11-28 11:53:50