1.域對象之間的關系:

     關聯(一對多,多對多),依賴(用到其它對象的方法或屬性),聚集(整體和部分),一般化(繼承)

2.域對象與數據庫之間的關系


 但是,表之間只能通過外鍵來表示關聯關系。其它關系都是借助hibernate的配置來實現的。


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

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

  property的formula指定一個SQL表達式(引用表字段,調用SQL函數,子查詢)  ,當表中不從在某屬性在表中不存在映射字段時用formula.

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




4.hibernate API 接口分類:

  訪問數據庫操作(insert,delete,update,query),有session,traction,quert..
  配置接口Configuration.
  回調接口(應用程序接受hibernate內部事件并作出相應回應)Inteceptor..,
  擴展接口
  同時,hibernate內部分裝了jndi&&jta,可以使hibernate和j2ee服務器集成。

    
   
  Configuration:配置并啟動根hibernate,創建sessionFactory對象。
  sessionFactory:對應一個數據存儲源。應用從sessionFactory中獲得session.
         sessionFactory緩存分兩種:內置(hibernate配置信息,映射元數據信息),外置是一個可配置的緩存插件,存放大量的數據庫數據拷貝,介 質可以是內存或硬盤

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

}
finally{
 session.close()
}

 session緩存(減少數據庫訪問頻率,保持緩存對象與數據庫同步):



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




6.hibernate訪問持久化對象

 
應用程序:
       調用getXXX()把信息輸出到用戶端,調用setXXX把用戶的輸入信息寫道Coustom對象中
Hibernate:
      調用 Coustom的getXXX(),把得到的信息保存到數據庫,調用Coustom的setXXX(),把數據庫信息寫道Coustom對象中.

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

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


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

<version name="version"  column="version" unsaved-value="0"/>  //name不可能為空,所以只能通過version版本控制來表示臨時和游離對象

8.關聯映射
  關系數據庫只存在外鍵參照關系(總是"many"參照"one"),即只支持一對多/多對一。

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

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


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

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


    9: 對象的狀態轉換

  臨時態:不在session緩存中,不在數據庫中
  持久態:總是被一個session實例(位于session緩存中),session在清理緩存時,會根據持久化對象屬性變化,同步數據庫
  游離態:不再session緩存中,保存在數據庫中

session的Load&Get:

Load返回游離對象本身,在加載不存在OID對象時報錯。
Get返回游離對象的副本拷貝,會立刻訪問數據庫,在加載不存在OID對象時返回null.


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






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


public class Address{   
 //Address沒有OID,因為不需要通過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檢索策略(延遲檢索、立即檢索、左外連接檢索)