很久沒有寫博客了,最近才發現Hibernae尚未寫完,那就繼續,就當本身好好複習了。言歸正傳、sql
一切的一切都要從數據的插入開始,沒有數據的插入就沒有數據來進行更新、刪除和修改。在Hibernate中使用最頻繁的用來插入數據的方法就是save()方法了。在Hibernate的官方API中對save方法的註釋很簡單:將指定的臨時對象持久化,並首先指定一個標識符,也就是咱們所說的OID,可是若是OID的生成策略是assigned的時候除外。緩存
註釋雖然很簡單,可是卻向咱們披露了足夠的信息。咱們從輸入、操做、輸出對它進行分析。session
1.輸入:一個處於臨時狀態的對象。這並非說咱們不能使用持久化對象和遊離對象作參數,只是說這樣操做不合規範。就像男人穿裙子同樣,不是說你不能穿,只是這樣不合常理而已。ide
2.操做:首先根據指定的OID生成策略給臨時對象生成一個OID,通常來講此時臨時對象的OID是NULL,除非你使用了assign策略或者人爲的指定了一個OID,可是事實證實這時沒有用的;接着把這個對象置入緩存中,使它成爲持久化對象;最後,計劃一個insert語句,注意,只是計劃,並無執行,只有當Session清理緩存時才執行sql語句。spa
3.輸出:一個持久化對象和一條sql語句,這個說法不是很準確,這樣說只是爲了便於理解而已。hibernate
就個人理解,save()方法就像魔獸中英雄在外面練級的時候,把野怪身上掉的寶物撿起來放在身上同樣。orm
前面咱們說人爲指定OID是沒有用的,能夠經過以下的代碼片斷來進行驗證:對象
Customer customer=new Customer();ci
customer.setId(
session.save(customer);
System.out.println(customer.getId());
結果代表,程序最後輸出的ID是根據標識符生成器生成的。另外還要注意的一點就是,當對象處於持久化狀態時,不能再隨意修改它的OID,不然Session在清理緩存時會拋出異常,如:
Customer customer=new Customer();
session.save(customer);
customer.setId(
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語句。