日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于Session接口的update方法主要有如下几点要注意

發布時間:2024/4/17 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于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方法主要有如下几点要注意的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。