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檢索策略(延遲檢索、立即檢索、左外連接檢索)