Hibernate學習(四):session.save()

很久沒有寫博客了,最近才發現Hibernae尚未寫完,那就繼續,就當本身好好複習了。言歸正傳、sql

一切的一切都要從數據的插入開始,沒有數據的插入就沒有數據來進行更新、刪除和修改。在Hibernate中使用最頻繁的用來插入數據的方法就是save()方法了。在Hibernate的官方API中對save方法的註釋很簡單:將指定的臨時對象持久化,並首先指定一個標識符,也就是咱們所說的OID,可是若是OID的生成策略是assigned的時候除外緩存

註釋雖然很簡單,可是卻向咱們披露了足夠的信息。咱們從輸入、操做、輸出對它進行分析。session

1.輸入:一個處於臨時狀態的對象。這並非說咱們不能使用持久化對象和遊離對象作參數,只是說這樣操做不合規範。就像男人穿裙子同樣,不是說你不能穿,只是這樣不合常理而已。ide

2.操做:首先根據指定的OID生成策略給臨時對象生成一個OID,通常來講此時臨時對象的OIDNULL,除非你使用了assign策略或者人爲的指定了一個OID,可是事實證實這時沒有用的;接着把這個對象置入緩存中,使它成爲持久化對象;最後,計劃一個insert語句,注意,只是計劃,並無執行,只有當Session清理緩存時才執行sql語句。spa

3.輸出:一個持久化對象和一條sql語句,這個說法不是很準確,這樣說只是爲了便於理解而已。hibernate

就個人理解,save()方法就像魔獸中英雄在外面練級的時候,把野怪身上掉的寶物撿起來放在身上同樣。orm

前面咱們說人爲指定OID是沒有用的,能夠經過以下的代碼片斷來進行驗證:對象

Customer customer=new Customer();ci

    customer.setId( 3L ); get

    session.save(customer);

System.out.println(customer.getId());

結果代表,程序最後輸出的ID是根據標識符生成器生成的。另外還要注意的一點就是,當對象處於持久化狀態時,不能再隨意修改它的OID,不然Session在清理緩存時會拋出異常,如:

Customer customer=new Customer();

    session.save(customer);

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

我還作了以下一個實驗,代碼片斷以下:

Customer customer=new Customer();

    session.save(customer);

session.save(customer);

tx.commit();

第一次調用save()方法時customer處於臨時狀態,而第二次調用save()方法是時它已經處於持久化狀態了,事實證實第二次的save操做徹底是多餘的,Hibernate並無爲它再計劃一個insert語句。

相關文章
相關標籤/搜索