1. 程式人生 > >Hibernate的方法獲取物件後,物件呼叫set後會自動更新資料庫內容的解決辦法

Hibernate的方法獲取物件後,物件呼叫set後會自動更新資料庫內容的解決辦法

例如:

Object obj = dao.get(Object_2.classs,id);

obj.setName("張三");

這種情況下Hibernate下次提交事務的時候會把這個資料庫中對應資料更新成set後的。

產生原因涉及到Hibernate設計原理,(以下這段話複製地址:http://blog.csdn.net/yang_lover/article/details/45057181)

1.瞬態:
 一個實體通過new操作符建立後,沒有和Hibernate的Session建立關係,也沒有手動賦值過該實體的持久化標識(持久化標識可以認為是對映表的主鍵)。
               此時該實體中任何屬性的更新都不會反映到資料庫表中。
2.持久化:
               當一個實體和Hibernate的Session建立了關係,並獲取了持久化標識,而且在Hibernate的Session生命週期記憶體在。
               此時針對該實體任何屬性的更改都會直接影響到資料庫表中一條記錄對應欄位的更新,即與資料庫表同步。
3.脫管:
              當一個實體和Hibernate的Session建立了關係,並獲取了持久化標識,而此時Hibernate的Session生命週期結束,實體的持久化標識沒有被改動過。
              針對該實體任何屬性的修改都不會及時反映到資料庫表中。

              關閉session可以使實體從持久化狀態轉為託管狀態。

解決辦法:

把上述程式碼例子中的物件"obj",呼叫方法:sessionFactory.getCurrentSession().evict(obj);

這樣即可避免自動更新。