當spring整合hibernate以後事務就會被spring進行託管,那麼當你在一個get一個對象以後在進行set對象時候你發現,事務提交後會執行一段update語句,數據庫中的值也會改變,這就是動態更新。就是說,你的查詢和賦值同時在一個相同的session中進行的,hibernate根據id判斷是同一個對象,因此會自動更新相應的屬性值。 java
其實自動更新只是爲了提升效率。 如果你不想讓它自動更新,大家可採起如下方法: 在映射文件相應屬性中設置update="false"能夠不用更新該字段或者是在映射文件中的class標籤裏面加上:dynamic-insert="false" spring
就像下邊這樣: sql
<class name="com.orm.UserInfo" table="user_info" 數據庫
dynamic-update="false" session
dynamic-insert="true" spa
optimistic-lock="version">hibernate
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User(); u.setBorn(new Date()); u.setUsername("zhangsan"); u.setPassword("zhangsan"); session.save(u); u.setPassword("222"); //該條語句沒有意義 session.save(u); u.setPassword("zhangsan111"); //沒有意義 session.update(u); u.setBorn(sdf.parse("1988-12-22")); //沒有意義 session.update(u); session.getTransaction().commit();
這個時候會發出多少sql語句呢?仍是一樣的道理,在調用save方法後,u此時已是持久化對象了,記住一點:若是一個對象以及是持久化狀態了,那麼此時對該對象進行各類修改,或者調用屢次update、save方法時,hibernate都不會發送sql語句,只有當事物提交的時候,此時hibernate纔會拿當前這個對象與以前保存在session中的持久化對象進行比較,若是不相同就發送一條update的sql語句,不然就不會發送update語句code
Hibernate: insert into t_user (born, password, username) values (?, ?, ?) Hibernate: update t_user set born=?, password=?, username=? where id=?
這樣
orm