关于Session接口的update方法主要有如下几点要注意
?
1.輸入?yún)?shù)
一般而言,傳遞給update的對(duì)象要是處于游離狀態(tài)的對(duì)象。如果傳一個(gè)持久化對(duì)象,那么update方法就是多余的,因?yàn)镠ibernate的臟檢查機(jī)制會(huì)自動(dòng)根據(jù)對(duì)象屬性值的變化向數(shù)據(jù)庫(kù)發(fā)送一條update語(yǔ)句;如果傳入的對(duì)象處于臨時(shí)狀態(tài),那么此時(shí)Hibernate應(yīng)該會(huì)拋出異常。因?yàn)镠ibernate在更新數(shù)據(jù)時(shí)會(huì)根據(jù)對(duì)象的OID去數(shù)據(jù)庫(kù)查找相應(yīng)的記錄并更新之,而在數(shù)據(jù)庫(kù)中是沒(méi)有記錄與這個(gè)臨時(shí)對(duì)象相關(guān)聯(lián)的,因此Hibernate會(huì)拋出異常,當(dāng)然如果你人為的給臨時(shí)對(duì)象指定一個(gè)OID就該另當(dāng)別論了,如下所示代碼片段:
Customer customer=new Customer();
customer.setId(3L);
customer.setName(“Cindyelf”);
session.update(customer);
這段代碼會(huì)導(dǎo)致如下的sql:update Customer set name=’Cindyelf’ where? id=3;當(dāng)然如果數(shù)據(jù)庫(kù)不存在id為3的那行記錄,Hibernate就會(huì)拋出異常。而給臨時(shí)對(duì)象指定OID是不合規(guī)范的操作,應(yīng)盡量避免。也就是說(shuō)不管傳入是什么狀態(tài)對(duì)象,數(shù)據(jù)庫(kù)中必須要有一條記錄與這個(gè)對(duì)象的OID相對(duì)應(yīng),否則拋出異常。
2.操作
執(zhí)行update方法的時(shí)候,Hibernate會(huì)首先把傳入的對(duì)象放入Session的緩存中,使之持久化,然后計(jì)劃執(zhí)行一個(gè)update語(yǔ)句。Hibernate在生成sql語(yǔ)句的時(shí)候會(huì)根據(jù)對(duì)象的當(dāng)前屬性值來(lái)組裝sql語(yǔ)句,也就是說(shuō),不管程序中修改了多少次屬性值,在執(zhí)行時(shí)只會(huì)執(zhí)行一條update一句。
此外,在update的官方API中特意強(qiáng)調(diào)了一點(diǎn),“如果在session的緩存中有一個(gè)持久化對(duì)象和所要更新的對(duì)象具有相同的OID,那么Hibernate會(huì)拋出異常”。下面的代碼片段演示了這個(gè)錯(cuò)誤:
Customer customer=new Customer();
session1.save(customer);
?
Customer customer1=(Customer)session.load(Customer.class,new Long(6))
session2.update(customer);
?
如上所示,我在session1中持久化了一個(gè)Customer對(duì)象,它的OID是6,然后我在session2中l(wèi)oad一個(gè)OID為6的對(duì)象customer1,然后在session2中update之前的customer,注意,對(duì)于session2而已,customer1是處于游離狀態(tài)的,因?yàn)樗惶幱趕ession2的緩存中。此時(shí)程序會(huì)報(bào)如下錯(cuò)誤:a different object with the same identifier value was already associated with the session。
轉(zhuǎn)載于:https://www.cnblogs.com/anuoruibo/archive/2012/03/20/2407948.html
總結(jié)
以上是生活随笔為你收集整理的关于Session接口的update方法主要有如下几点要注意的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HDU 2112 HDU Today (
- 下一篇: RadioWar_RFID_LiveCD