2010-03-19 82 views
1

我有什麼可能是一個非常基本的休眠問題。 HQL(和/或標準)更新查詢是否會導致實時域對象的更新?他們是否會自動從第一級緩存中刷新現在無效的域對象?HQL更新和域對象

例子:

Player playerReference1 = session.get(Player.class,1); 
session.createQuery("update players set gold = 100").executeUpdate(); 
//Question #1 -- does playerReference1.getGold() now return 100? 
Player playerReference2 = session.get(Player.class,1); 
//Question #2 -- does playerReference2.getGold() return 100, or is it the same exact object? 

我應該驅逐所有受影響的對象通過HQL更新,如果有一個機會,一些代碼以後會需要它的做法?

+0

實際上,您的解決方案對我來說工作得很好,在批量更新似乎是個好主意之後對當前會話執行flush + clear操作 – 2011-08-24 14:06:49

回答

2

這兩個問題的答案都是否定的。據Java Persistence with Hibernate,第12章:

如果執行直接操作數據庫中的行SQL語句,您所作的任何更改不會影響內存中的對象(在任何狀態他們可能是)。換句話說,任何直接的DML語句都會跳過Hibernate持久化上下文(以及所有緩存)。

這也適用於HQL。他們建議在從會話中加載任何對象之前執行DML。

+0

但這是HQL語句,而不是SQL語句。 – 2010-03-19 17:50:15

+0

Hrm ...我以爲HQL語句比會話緩存中的SQL語句更聰明。顯然不是。謝謝! – 2010-03-19 17:58:12

+0

這也適用於HQL。我更新了我的答案。 – 2010-03-19 18:03:02