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

來源:互聯網
上載者:User

今天老師重新詳細講解了hibernate 裡的POVO.

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.