天天看點

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);

這樣即可避免自動更新。