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检索策略(延迟检索、立即检索、左外连接检索)