1.域?qū)ο笾g的關(guān)系:

     關(guān)聯(lián)(一對(duì)多,多對(duì)多),依賴(用到其它對(duì)象的方法或?qū)傩裕奂ㄕw和部分),一般化(繼承)

2.域?qū)ο笈c數(shù)據(jù)庫(kù)之間的關(guān)系


 但是,表之間只能通過(guò)外鍵來(lái)表示關(guān)聯(lián)關(guān)系。其它關(guān)系都是借助hibernate的配置來(lái)實(shí)現(xiàn)的。


3.sql語(yǔ)句的實(shí)現(xiàn):
  hibernate會(huì)在初始化階段預(yù)定義一些insert,update,delete語(yǔ)句,保存在sessionFactory緩存中。
  在hibernate初始化初期,就會(huì)根據(jù)映射文件配置信息,為持久化對(duì)象預(yù)定義sql語(yǔ)句,并保存在sessionFactory緩存中(HQL則是在程序運(yùn)行是動(dòng)態(tài)生成):
  insert,update,delete,select,默認(rèn)情況包括對(duì)象的所有字段,可以設(shè)置為不包括(適用insert/update)。

<proprety name="XXX " insert="false" column="XXX">

  property的formula指定一個(gè)SQL表達(dá)式(引用表字段,調(diào)用SQL函數(shù),子查詢)  ,當(dāng)表中不從在某屬性在表中不存在映射字段時(shí)用formula.

<property name="totlaprice" formula="(select sum(price) form table)">  //子查詢




4.hibernate API 接口分類:

  訪問(wèn)數(shù)據(jù)庫(kù)操作(insert,delete,update,query),有session,traction,quert..
  配置接口Configuration.
  回調(diào)接口(應(yīng)用程序接受hibernate內(nèi)部事件并作出相應(yīng)回應(yīng))Inteceptor..,
  擴(kuò)展接口
  同時(shí),hibernate內(nèi)部分裝了jndi&&jta,可以使hibernate和j2ee服務(wù)器集成。

    
   
  Configuration:配置并啟動(dòng)根hibernate,創(chuàng)建sessionFactory對(duì)象。
  sessionFactory:對(duì)應(yīng)一個(gè)數(shù)據(jù)存儲(chǔ)源。應(yīng)用從sessionFactory中獲得session.
         sessionFactory緩存分兩種:內(nèi)置(hibernate配置信息,映射元數(shù)據(jù)信息),外置是一個(gè)可配置的緩存插件,存放大量的數(shù)據(jù)庫(kù)數(shù)據(jù)拷貝,介 質(zhì)可以是內(nèi)存或硬盤(pán)

5. session:
   session是輕量級(jí)的,通常將一個(gè)session實(shí)例和一個(gè)數(shù)據(jù)庫(kù)事務(wù)綁定。session實(shí)現(xiàn)類中定義了java集合,構(gòu)成了session緩存 
Session session=sessionFactory.openSession();
Traction tx
=null;
try{
 tx
=session.beingTraction();
   
//開(kāi)始一個(gè)事務(wù)
  ..
   
//提交一個(gè)事務(wù)
  tx.commit();
 
}
catch(Exception e){
  
if(tx!=null)
  tx.rollback()

}
finally{
 session.close()
}

 session緩存(減少數(shù)據(jù)庫(kù)訪問(wèn)頻率,保持緩存對(duì)象與數(shù)據(jù)庫(kù)同步):



  
   session.close()清理緩存。
   session的setFlushModel()設(shè)定清理緩存的時(shí)間。




6.hibernate訪問(wèn)持久化對(duì)象

 
應(yīng)用程序:
       調(diào)用getXXX()把信息輸出到用戶端,調(diào)用setXXX把用戶的輸入信息寫(xiě)道Coustom對(duì)象中
Hibernate:
      調(diào)用 Coustom的getXXX(),把得到的信息保存到數(shù)據(jù)庫(kù),調(diào)用Coustom的setXXX(),把數(shù)據(jù)庫(kù)信息寫(xiě)道Coustom對(duì)象中.

   一般我們不會(huì)在持久化對(duì)象中加入業(yè)務(wù)邏輯代碼,列外總是有的。hibernate可以訪問(wèn)任何方法(包括private,應(yīng)用程序做不到)。

public void setXXX( Object o){
 
this.o=o;
  
//插入業(yè)務(wù)邏輯代碼
 caculate();
  
//結(jié)束
}


7.持久化對(duì)象配置:
  應(yīng)用程序按內(nèi)存地址區(qū)分對(duì)象,hibernate按對(duì)象標(biāo)志符區(qū)分對(duì)象(<id元素表示對(duì)象標(biāo)志符>),對(duì)象標(biāo)志符3不變(不為空,不修改,不重復(fù))。
  映射單個(gè)自然主鍵: 
<id name="name" column="name" type="string">
  
<generator class="assigned"/>//assigned表示由應(yīng)用程序賦值
</id>

<version name="version"  column="version" unsaved-value="0"/>  //name不可能為空,所以只能通過(guò)version版本控制來(lái)表示臨時(shí)和游離對(duì)象

8.關(guān)聯(lián)映射
  關(guān)系數(shù)據(jù)庫(kù)只存在外鍵參照關(guān)系(總是"many"參照"one"),即只支持一對(duì)多/多對(duì)一。

public class Coustom{
  
private int ID;
  
private String name;
      private Set orders=new HashSet(); //一對(duì)多關(guān)系中
//access method
 
}

public class Orders{
  
private int ID;
  
private Coustom coustom;               //多對(duì)一中,只有'many'方需要引用one'方,'one'方則不需要知道'many'方
//access method
 
}


    Orders中映射配置代碼(多對(duì)一):
<many-to-one name="coustom" column="coustom_id" class="Coustom"      
 cascade
="save-update"    //級(jí)聯(lián)保存更新

 not-null
="true">
  
     Coustom中映射配置代碼(一對(duì)多):
<set name="orders" cascade="save-update">
  
<key column="coustom_id"/>
  
<one-to-many class="Orders">
</set>


    9: 對(duì)象的狀態(tài)轉(zhuǎn)換

  臨時(shí)態(tài):不在session緩存中,不在數(shù)據(jù)庫(kù)中
  持久態(tài):總是被一個(gè)session實(shí)例(位于session緩存中),session在清理緩存時(shí),會(huì)根據(jù)持久化對(duì)象屬性變化,同步數(shù)據(jù)庫(kù)
  游離態(tài):不再session緩存中,保存在數(shù)據(jù)庫(kù)中

session的Load&Get:

Load返回游離對(duì)象本身,在加載不存在OID對(duì)象時(shí)報(bào)錯(cuò)。
Get返回游離對(duì)象的副本拷貝,會(huì)立刻訪問(wèn)數(shù)據(jù)庫(kù),在加載不存在OID對(duì)象時(shí)返回null.


10:聚集映射(組件可嵌套配置)
 對(duì)應(yīng)用程序按照精粒度設(shè)計(jì)原則,盡量提高代碼重用性。對(duì)關(guān)系數(shù)據(jù)庫(kù)盡可能減少表的數(shù)量,這樣一個(gè)表可以對(duì)應(yīng)多個(gè)類。






public class coustom{
      private  Long  id;
 
private Address homeaddress;
      
}


public class Address{   
 //Address沒(méi)有OID,因?yàn)椴恍枰ㄟ^(guò)session保存,更新。
  
private String city;
  
private String street;
  
private String zipcode;
     private  String province;
     private  Coustom coustom; //所屬的整體類

}


 配置代碼:

<component name="homeaddress" class="Address">
<parent name="coustom" />   //指定Address所屬的整體類
<property name="street" column="home_street"/>
<property name="city" column="home_city"/>
<property name="province" column="home_province"/>
<property name="zipcode" column="home_zipcode"/>
</component>



11.hibernate檢索策略(延遲檢索、立即檢索、左外連接檢索)