好久沒有寫部落格了,最近才發現Hibernae還沒有寫完,那就繼續,就當自己好好複習了。言歸正傳、
一切的一切都要從資料的插入開始,沒有資料的插入就沒有資料來進行更新、删除和修改。在Hibernate中使用最頻繁的用來插入資料的方法就是save()方法了。在Hibernate的官方API中對save方法的注釋很簡單:将指定的臨時對象持久化,并首先指定一個辨別符,也就是我們所說的OID,但是如果OID的生成政策是assigned的時候除外。
注釋雖然很簡單,但是卻向我們披露了足夠的資訊。我們從輸入、操作、輸出對它進行分析。
1.輸入:一個處于臨時狀态的對象。這并不是說我們不能使用持久化對象和遊離對象做參數,隻是說這樣操作不合規範。就像男人穿裙子一樣,不是說你不能穿,隻是這樣不合常理而已。
2.操作:首先根據指定的OID生成政策給臨時對象生成一個OID,一般來說此時臨時對象的OID是NULL,除非你使用了assign政策或者人為的指定了一個OID,但是事實證明這時沒有用的;接着把這個對象置入緩存中,使它成為持久化對象;最後,計劃一個insert語句,注意,隻是計劃,并沒有執行,隻有當Session清理緩存時才執行sql語句。
3.輸出:一個持久化對象和一條sql語句,這個說法不是很準确,這樣說隻是為了便于了解而已。
就我的了解,save()方法就像魔獸中英雄在外面練級的時候,把野怪身上掉的寶物撿起來放在身上一樣。
前面我們說人為指定OID是沒有用的,可以通過如下的代碼片段來進行驗證:
Customer customer=new Customer();
customer.setId(3L);
session.save(customer);
System.out.println(customer.getId());
結果表明,程式最後輸出的ID是根據辨別符生成器生成的。另外還要注意的一點就是,當對象處于持久化狀态時,不能再随意修改它的OID,否則Session在清理緩存時會抛出異常,如:
customer.setId(3L);
tx.commit();
此時程式抛出如下異常:org.hibernate.HibernateException: identifier of an instance of cn.edu.hust.cm.mypack.Customer was altered from 7 to 3
我還做了如下一個實驗,代碼片段如下:
session.save(customer);
第一次調用save()方法時customer處于臨時狀态,而第二次調用save()方法是時它已經處于持久化狀态了,事實證明第二次的save操作完全是多餘的,Hibernate并沒有為它再計劃一個insert語句。
本文轉自 646676684 51CTO部落格,原文連結:http://blog.51cto.com/2402766/615881,如需轉載請自行聯系原作者