2011-03-26 82 views
2

我有兩個實體(例如降低儘可能;每個實體有一個ID字段):刷新休眠式

@Entity 
public class A { 
    @Column(nullable = false) 
    private double foo; 

    @Formula(value = "foo - (select coalesce(sum(x.foo), 0) from x where x.a_id = id)") 
    private double bar; 
} 

@Entity 
public class X { 
    @ManyToOne(optional = false) 
    private A a; 

    @Column(nullable = false) 
    private double foo; 
} 

當我創建一個新的Xnew X()beginTransaction(),save(x),commit())A.bar的值不刷新。

我認爲這是因爲舊的(和錯誤的)值仍然在一級緩存中(沒有二級緩存)。我不想調用Session.clear(),因爲此方法似乎會使現有的實體對象無效。我還能做些什麼來解決這個問題?

編輯:如這裏要求是代碼保存X -objects:

// setters 
getSession().beginTransaction(); // getSession() returns the current session 
getSession().save(entity); // entity is an instance of X 
getSession().getTransaction().commit(); 
+0

你可以粘貼代碼來保存X嗎? – Premraj 2011-03-26 13:34:34

回答

2

Session.clear將刪除該會話的所有緩存的對象。相反,您可以在會話中使用evict方法並指定一個對象,該對象只從緩存中刪除指定的對象。

0

我試圖解決清除緩存的問題,但後來出現了新問題,並且使得緩存或多或少無用,因爲X es經常更改。 (事實上​​,子查詢比問題中顯示的要複雜得多,它使用更多表格)。

現在我使用的是沒有第一級緩存的StatelessSession。這解決了這個問題。由於數據庫是嵌入式h2-Database,因此性能迴歸並不明顯。