Hibernate笔记

来源:互联网 发布:mac访问windows共享 编辑:程序博客网 时间:2024/04/30 11:12

1、Object Relation Mapping
  
持久化类与关系表对应,持久化类实例与表中一行记录对应。
2、Hibernate核心接口
  
访问数据库接口:Session、Transation、Query、Criteria
   配置Hibernate接口:Configuration
   Configuration --(实例化创建)-->SessionFaction--(实例化)-->Session---->(Qurey/Criteria/Transaction)

3、Hibernate使用步骤
  
a、创建Hibernate配置文件
   b、创建持久化类
   c、创建对象关系映射文件
   d、通过接口访问DATABASE

4、持久化类
   被Hibernate持久化到数据库中,通过Setter和Getter方法,若为boolean型则可用is*方法。Hibernate不要求持久化类必须实现Serializable,但在分布式不同结点间传输持久化类必须实现Serializable接口。
5、Hibernate与EJB
  
Hibernate为普通JAVA类,而EJB必须实现EJB各个接口,运行于容器之中。
6、链编程风格(初始化)
  
sessionFactory = new Configuration()
              .addClass(AAA.class)
              .buildSessionFactory();

7、执行数据库操作
  
初始化后由sessionFactory.openSession()方法获得session实例,并由session实例执行数据库有关操作,save()、update()、delete()、load()、find()。
8、属性作用范围
  
在映射文件中元素class中属性scope-field设置全局属性作用域;
   在映射文件中元素property中scope-field设置为局部属性作用范围。

9、持久化类访问方法
  
用户--->应用程序--->Setter()<---Hibernate<---DATABASE
   用户<---应用程序<---Getter()--->Hibernate--->DATABASE

10、持久化类中加入程序逻辑
  
Student类中包含firstName、lastName,STUDENT表中只有NAME字段
   getName()
   {
       return firstName+lastName;
   }
   setName(String name)
   {
       firstName = ...;
       lastName  = ...;
   } 
   Hibernate映射文件中只需要映射name和NAME<property name="name" column="NAME"/>,就可以访问setName()和getName()方法,以映射文件为准。

11、formula属性
   
property元素中的formula属性用于指定一个SQL表达式,可调用SQL函数货包括子查询。
    <property name = "totalPrice" formula = "(select sum(o.price) from ORDERS o where o.CUSTUMER_ID = '1222')"/>
    当查询CUSTOMER对象时,执行语句:select ID,NAME,(select SUM(O.PRICE) from ORDERS o where o.CUSTOMER_ID = '1222') from CUSTOMERS;

12、dynamic-insert和dynamic-update
   
应用中把class中dynamic-insert和dynamic-update值设为true可以提高效率,即插入时仅包含字段取值不为null的字段,更新时仅包含字段值发生变化的属性。
13、Hibernate中package属性
   
package属性用于指定本映射文件中包含类的包名为全局包,从而不必为每个类指定完整包名。
14、OID
   
Hibernate中用对象标识符OID来维持java对象和表中记录的对应关系,OID定义为整数类型(short、int、long),通常由Hibernate或通过底层数据库给OID赋值。
15、标识符生成器
    Hibernate中内置标识符生成器,均适合代理主键
    increment:由Hibernate自增生成
    identity:由底层数据库生成
    sequence:底层数据库序列生成
    hilo:根据high/low等算法生成以特定表字段作high值
    native:自动选择identity、dequence、hilo
    assgned:自然主键(尽量避免使用)

16、inverse属性
   
为避免Hibernate在清理缓存时对相关联对象都执行更新操作,将inverse设置为true,将主控权交给many一方,以仅控mamy方状态更新对象。
17、cascade属性
   
级联属性,当cascade属性设置为delete,在删除一对象时自动删除与其级联的对象,删除后持久化对象变为临时状态。
18、session清理缓存时间点
   
a、commit()时先清理缓存,再向DATABASE提交事务
    b、执行find()和iterate()时,确保对象最新状态(iterate()在Hibernate 3#已取消
    c、显式调用flush()方法时

19、持久化对象三状态
   
a、临时状态,刚new,不处于session缓存中
    b、持久化状态,已持久化并加入session中
    c、游离状态,被持久化,但不在session中

20、load()和get()
   
两者都可以由OID加载一个持久化对象,当DB中不存在与OID对应记录时,load()方法会抛出异常,而get()会返回Null值。

 21、session激发触发器
   
如果一个session激发一个触发器,由于触发器对session是透明的,一次造成数据不一致。
    解决方法:调用session的flush()方法和refresh()使其同步;
    由于使用触发器使得在update时候无法比较属性是否发生变化。
    解决方法:在class元素中设置select-before-update为true。

22、精粒度对象模型
    从一类中抽象出来的单独类,提高代码重用性,被抽象出来的类在映射文件中定义为<component>,无OID,必须依赖父类。
23、session三种检索类型
   
a、load()跟get()都以OID加载
       Customer customer = (Customer)session.load(Customer.class,new Long(1));//同get()方法
    b、find()方法通过HQL进行检索(Hibernate 3# 取消该方法)
       List customeLists = session.find("from Customer as c where c.id = 1);

24、延迟检索策略(Hibernate 3# 默认为true
    class种lazy为true时设置延迟检索,load方法仅返回代理类实例,在第一次使用才加载该实例所有数据,只对load方法有效。
25、HQL检索方式
   
List result = session.createQuery("HQL language")
                   .setString("customerName","improviser")
                   .setInteger("customerAge",23)
                   .list();

26、QBC检索方式
    QBC由Criteria和Criterion接口、Expression类组成,支持运行时生成查询语句。Expression提供查询静态方法,返回Criterion对象,Criteria的add方法加入Criterion对象,并以list()执行查询,返回查询结果。
27、QBE检索方式
    先创建一个对象模板,再检索所与该模板相同对象,Example创建一个Criterion对象,把Example对象中不为null的属性作为查询条件,QBE只支持"="和"like"比较。
28、分页查询
   
query.setFirstResult(0);//从第一页开始检索
    query.setMaxResults(10);//最多检出10条记录

29、字符配匹模式
    字符串通配符为"%"和"_",中文字应为"%%"配匹;在QBC中可以用MatchMode的静态常量实例来设定字符串模式,如Expression.like("name","i",MatchModle.START))。
30、事务一般用法

 1     try
 2     {
 3        tx = session.beginTransaction();
 4        
 5        tx.commit();
 6     }catch(Exception e)
 7     {
 8        if(tx!=null)
 9          try{
10               tx.rollback();
11             }catch(HibernateException ex{}
12     }finally
13     {
14          try{
15           session.close();
16             }catch(){}
17     }


原创粉丝点击