關於Session接口的update方法主要有以下幾點要注意:sql
1.輸入參數數據庫
通常而言,傳遞給update的對象要是處於遊離狀態的對象。若是傳一個持久化對象,那麼update方法就是多餘的,由於Hibernate的髒檢查機制會自動根據對象屬性值的變化向數據庫發送一條update語句;若是傳入的對象處於臨時狀態,那麼此時Hibernate應該會拋出異常。由於Hibernate在更新數據時會根據對象的OID去數據庫查找相應的記錄並更新之,而在數據庫中是沒有記錄與這個臨時對象相關聯的,所以Hibernate會拋出異常,固然若是你人爲的給臨時對象指定一個OID就該另當別論了,以下所示代碼片斷:緩存
…………………………………………session
Customer customer=new Customer();
customer.setId(
customer.setName(「Cindyelf」);
session.update(customer);對象
…………………………………………接口
這段代碼會致使以下的sql:update Customer set name=’Cindyelf’ where id=3;固然若是數據庫不存在id爲3的那行記錄,Hibernate就會拋出異常。而給臨時對象指定OID是不合規範的操做,應儘可能避免。也就是說無論傳入是什麼狀態對象,數據庫中必需要有一條記錄與這個對象的OID相對應,不然拋出異常。ci
2.操做
執行update方法的時候,Hibernate會首先把傳入的對象放入Session的緩存中,使之持久化,而後計劃執行一個update語句。Hibernate在生成sql語句的時候會根據對象的當前屬性值來組裝sql語句,也就是說,無論程序中修改了多少次屬性值,在執行時只會執行一條update一句。
此外,在update的官方API中特地強調了一點,「若是在session的緩存中有一個持久化對象和所要更新的對象具備相同的OID,那麼Hibernate會拋出異常」。下面的代碼片斷演示了這個錯誤:
…………………………………………
Customer customer=new Customer();
session1.save(customer);
…………………………………………
…………………………………………
Customer customer1=(Customer)session.load(Customer.class,new Long(6))
session2.update(customer);
…………………………………………
如上所示,我在session1中持久化了一個Customer對象,它的OID是6,而後我在session2中load一個OID爲6的對象customer1,而後在session2中update以前的customer,注意,對於session2而已,customer1是處於遊離狀態的,由於它不處於session2的緩存中。此時程序會報以下錯誤:a different object with the same identifier value was already associated with the session。