关于Session接口的update方法主要有如下几点要注意
?
1.輸入參數
一般而言,傳遞給update的對象要是處于游離狀態的對象。如果傳一個持久化對象,那么update方法就是多余的,因為Hibernate的臟檢查機制會自動根據對象屬性值的變化向數據庫發送一條update語句;如果傳入的對象處于臨時狀態,那么此時Hibernate應該會拋出異常。因為Hibernate在更新數據時會根據對象的OID去數據庫查找相應的記錄并更新之,而在數據庫中是沒有記錄與這個臨時對象相關聯的,因此Hibernate會拋出異常,當然如果你人為的給臨時對象指定一個OID就該另當別論了,如下所示代碼片段:
Customer customer=new Customer();
customer.setId(3L);
customer.setName(“Cindyelf”);
session.update(customer);
這段代碼會導致如下的sql:update Customer set name=’Cindyelf’ where? id=3;當然如果數據庫不存在id為3的那行記錄,Hibernate就會拋出異常。而給臨時對象指定OID是不合規范的操作,應盡量避免。也就是說不管傳入是什么狀態對象,數據庫中必須要有一條記錄與這個對象的OID相對應,否則拋出異常。
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。
轉載于:https://www.cnblogs.com/anuoruibo/archive/2012/03/20/2407948.html
總結
以上是生活随笔為你收集整理的关于Session接口的update方法主要有如下几点要注意的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 2112 HDU Today (
- 下一篇: RadioWar_RFID_LiveCD