心無痕的博客

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          JAVA技術(shù)文檔

          JAVA精典網(wǎng)站

          開發(fā)工具

          數(shù)據(jù)庫

          最新評論

          深入淺出hibernate之PO,VO,load,get

          今天老師重新詳細(xì)講解了hibernate 里的POVO.

                最開始理解的POVO,感覺就是通過SAVE()方法,將OBJ 持久化到數(shù)據(jù)庫.如果要UPDATE,只要將oBJ 里屬性SET一個(gè)新值,然后執(zhí)行下UPDATE就好(這是種錯(cuò)誤的概念),因?yàn)槟菚r(shí)還沒怎么接觸POVO,一開始看到這個(gè)已經(jīng)感到很強(qiáng)大了,馬上就在腦子中記住了POVO.
                本以為在項(xiàng)目中可以得心應(yīng)手的利用這個(gè)好處,結(jié)果錯(cuò)誤的理解讓我出了很多異常:
                a different object with the same identifier value was already associated with the session;
                上面就是其中一個(gè),原因是對于POVO的理解錯(cuò)誤,引起的,先看下面的一段代碼:
                  Cat princess = new Cat();//新建一個(gè)Cat對象
            princess.setId("402881830c2cf0f3010c2cf0f8b40001");//將對象set一個(gè)數(shù)據(jù)庫中已存在的ID
            princess.setName("Princess");
            princess.setSex('F');
            princess.setWeight(18.8f);
            
            Cat princess2 = new Cat();//又新建一個(gè)Cat對象
            princess2.setId("402881830c2cf0f3010c2cf0f8b40001");//同時(shí)將這個(gè)對象也set相同的ID
            princess2.setName("Princess");
            princess2.setSex('F');
            princess2.setWeight(19.8f);
            
            Session session = HibernateSessionFactory.currentSession();//好戲出場了,我們先current a Session
            Transaction tx = session.beginTransaction();//開始事物(Transaction到底是什么也不太懂,我只知道它可以將緩存中數(shù)據(jù)寫入數(shù)據(jù)庫)
          //  Cat c = (Cat)session.load(Cat.class, "402881830c2cf0f3010c2cf0f8b40001");
          //  c.setWeight(20.3f);
            session.saveOrUpdate(princess);//此時(shí)我們用session保存了princess,這之后的princess應(yīng)該是持久化了,成了PO
            session.saveOrUpdate(princess2);//如果按我一開始的理解,此時(shí)princess2應(yīng)該也是可以持久化的(看上面蘭色部分),因?yàn)閜rincess2只是將princess更新了而已(這是致命的錯(cuò)誤).
            tx.commit();
            
            HibernateSessionFactory.closeSession();
            
             執(zhí)行的結(jié)果總是那么諷刺, a different object with the same identifier value was already associated with the session
             遇到了問題,總是最讓人興奮與無奈的時(shí)候.還是來看看為什么出錯(cuò)吧:
            首先來講講POVO,PO又名persistence object,持久化對象,是指在對象通過save(),update(),load(),get();后,在session的Entity map實(shí)體容器里將持久話的對象add進(jìn)去,也就是說,在我session.saveOrUpdate(princess);時(shí),實(shí)體容器里已經(jīng)將key和對象加入了.因?yàn)閙ap是通過不同key來加OBJ的,而在hibernate里ID是唯一標(biāo)識,使用ID來當(dāng)做key是最好不過的了.因此Session 的實(shí)體容器只能加入一個(gè)id的對象.當(dāng)session.saveOrUpdate(princess2);的時(shí)候,session準(zhǔn)備把princess2也add到entityMap里時(shí),由于相同的id,也就是key,它就報(bào)異常了a different object with the same identifier ..恭喜中標(biāo).
           
            也就是說PO是在session 的實(shí)體容器里可引用的對象,當(dāng)我要更新PO時(shí),可以set一個(gè)屬性值,然后只要tx.commit();動作,就可以更新了(讓我個(gè)人感到非常驚訝的地方).
            除了save();之外,同樣通過load,update,get也可以獲得PO.不過load和get有一少許區(qū)別(在使用的版本3.0中),get(id)就直接把DO獲得(馬上執(zhí)行select操作),而load則不同,它會先對要load的ID做個(gè)標(biāo)記,當(dāng)要使用這個(gè)導(dǎo)出的對象時(shí),它再執(zhí)行.用上面的例子:
           
              Cat c = (Cat)session.load(Cat.class, "402881830c2cf0f3010c2cf0f8b40001");//此時(shí)只是做標(biāo)記
              c.setWeight(20.3f);//這個(gè)時(shí)候才真正的執(zhí)行了select 語句.

          posted on 2008-04-09 12:58 心無痕 閱讀(1659) 評論(1)  編輯  收藏 所屬分類: JAVA

          評論

          # re: 深入淺出hibernate之PO,VO,load,get 2008-12-15 12:39 雨吻春

          這個(gè)似乎跟事務(wù)提交的時(shí)候有關(guān)而已,更新丟失的問題  回復(fù)  更多評論   

          主站蜘蛛池模板: 常州市| 桃园县| 张家港市| 广饶县| 中西区| 北安市| 西华县| 江西省| 曲周县| 塔城市| 耿马| 杭锦旗| 巴楚县| 德阳市| 敦煌市| 东明县| 太仆寺旗| 富民县| 团风县| 长海县| 若尔盖县| 瑞金市| 稻城县| 鸡西市| 宾阳县| 南投市| 修水县| 茂名市| 宽甸| 万宁市| 昭觉县| 武山县| 芮城县| 泗阳县| 从化市| 湘潭市| 谷城县| 长宁区| 迁西县| 巩留县| 沐川县|