Hibernate的get和load方法查詢出的實體都是持久化對象,拿到該對象后,如果你調用了該對象的set方法,如果再同一個事務里面,那么在事務遞交的時候,Hibernate會把你設置的值自動更新到數據庫中。
解決方案如下:
1,通過AOP對事務的service層,Dao層的管理
2,在獲取實體對象后,調用下getHibernateTemplate().evict(entity)方法,該方法的作用是把持久化對象變成托管狀態。變成托管狀態后,Hibernate就不會再去自動更新該實體
3 Hibernate的幾種實體狀態:
3.1.瞬態:
一個實體通過new操作符創建后,沒有和Hibernate的Session建立關系,也沒有手動賦值過該實體的持久化標識(持久化標識可以認為是映射表的主鍵)。
此時該實體中任何屬性的更新都不會反映到數據庫表中。
3.2.持久化:
當一個實體和Hibernate的Session創建了關系,並獲取了持久化標識,而且在Hibernate的Session生命周期內存在。
此時針對該實體任何屬性的更改都會直接影響到數據庫表中一條記錄對應字段的更新,即與數據庫表同步。
3.3.脫管:
當一個實體和Hibernate的Session創建了關系,並獲取了持久化標識,而此時Hibernate的Session生命周期結束,實體的持久化標識沒有被改動過。
針對該實體任何屬性的修改都不會及時反映到數據庫表中。
關閉session可以使實體從持久化狀態轉為托管狀態。