Hibernate学习知识总结

      Hibernate 是一个能够将JavaBean对象和数据库的表建立对应关系的映射框架,它通过对JDBC进行对象封装,最终实现面向对象的数据持久化。ORM是hibernate持久化的一种解决方案,是把对象模型和关系型数据库关系模型映射起来,主要表现为:类和表的映射;属性和主键的映射;属性和普通字段的映射,并且使用原始数据对这些映射进行描述。

 一、hibernate的核心接口

       在使用hibernate之前,我们首先要了解它经常使用的接口。

1、Configuration接口:Configuration对象用来配置和引导Hibernate,一个Hibernate使用一个Configuration实例来指定主配置文件的位置。

2、SessionFactory接口(重量级,单实例):因为创建它的代价较大,一个应用只能有一个SessionFactory,所以应把它设为静态变量,并在应用初始化时被创建。

3、Session接口:它被称为持久化管理器,Session实例是轻量级的,会为每一个事物创建一个Session实例,并在使用之后关闭它。它主要有save()、get()、update()、delete()(数据的保存、获取、更改和删除)

4、Transaction接口:是对实际事物的一个抽象,主要定义了commit()和rollback()两个方法。

5、Query接口:允许在数据库上执行查询,查询使用HQL或SQL。Query实例可用来绑定查询参数,限定查询返回的结果数,并且最终执行查询。


二、Hibernate中实体对象的三种状态及转换

1、瞬时状态:刚用new语句创建,还没有被持久化,且不处于Session的缓存中。通过save()、saveOrupdate()方法转换为持久态。 

2、持久状态:已经被持久化,且加入到Session的缓存中。Session的get()、load()方法可以直接获得一个持久态,Session关闭之后,原有的持久态就变成了游离态;而通过delete()方法可转变为瞬时态。

3、游离状态:已经被持久化,但不再处于Session的缓存中。游离态可以通过update()、save()方法重新回到持久态。

      持久态与游离态的共同点在于:都有数据表的一行与之对应。

 

三、Hibernate的关联映射

1、单向多对一关联(many-to-one)

      many的一端应持有one的一端的对象(引用);映射文件体现多对一;关联操作

 映射文件例:
<hibernate-mapping>
      <class name="org.ijob.bean.Resume" table="ijob_resume">
      <!—省略主键映射及属性映射 -->
      <!-- 多对一关联 -->
            <many-to-one name="seeker" class="org.ijob.bean.Seeker">      

                <column name="seeker_id"></column>                

           </many-to-one>
    </class>
</hibernate-mapping>


2、单向一对多关联(one-to-many)

     one的一端应持有many端的对象集合;映射文件体现一对多;关联操作

        映射文件例:
<hibernate-mapping>
        <class name="org.ijob.bean.Seeker" table="ijob_seeker">
       <!—省略主键映射及属性映射 -->
            <set name="resumes" >                                                

                   <key column="seeker_id"></key>                           

                  <one-to-many class="org.ijob.bean.Resume"/>              

           </set>
      </class>
</hibernate-mapping>

3、一对一关联

     一对一关联是特殊的一对多关联,many的一端是唯一的而不是多个。有以下两种实现方法:

     <many-to-one name="resume" class="org.ijob.bean.Resume" column="resume_id"  unique="true" />
     <one-to-one name="purpose" class="org.ijob.bean.Purpose" property-ref="resume" />

4、多对多关联

      将多对多转换成两个一对多;为中间表建立实体类及映射文件,两个端点和中间端分别建立双向一对多关联

如果中间表是联合主键:
<!-- 联合主键 -->
<composite-id>
        <key-many-to-one name=“**” column=“***" class=“***" ></key-many-to-one>
        <key-many-to-one name=“**” column=“**" class=“**" ></key-many-to-one>
</composite-id>

四、HQL查询和Criteria查询

        它们是hibernate查询支持的两种方式。

       HQL查询:

       HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象和属性的概念。

1、使用HQL的步骤

           得到Session
           编写HQL语句
           创建Query对象:Query接口是HQL 查询接口。它提供了各种的查询功能
           执行查询,得到结果
2、HQL基本语法

      # 选择:与SQL的基本相同:都是使用where 子句指定限定条件;通过与SQL 相同的比较操作符指定条件,如: =、<>、<、>、>=、<=、between、not between、in、not in、is、like;通过and、or 等逻辑连接符组合各个逻辑表达式。

      # 投影:选择出现在结果集中的字段,默认情况下结果为对象数组组成的集合。

      # 通用查询参数绑定方法:参数绑定有两种方法,分别是利用定位参数(从0开始计数)和利用命名参数。Query接口提供多个设置参数的方法,用来绑定大多数Hibernate内建类型的参数,例如setInteger()、setTimestamp()、setLocale() 等。setParameter()方法允许绑定任何hibernate类型实参。

     #分页:query.setFirstResult(i)(参数是开始获取对象的行数,从0开始编号);

                  query.setMaxResults(n)(参数是获取对象的数目)

     #分组函数:组函数有count()、min()、max()、sum()和avg(),其含义和SQL中定义的一样。

    
Criteria查询

       Criteria查询(对象查询),它用面向对象的方式将构造查询的过程做了封装。


    1、
查询语句如下:Criteria criteria = session.createCriteria(**.class);
                               List users = criteria.list();

     2、使用Criteria.add()方法设定查询条件,使用Restrictions的各种静态方法传回 ,使用Criteria.addOrder(order.asc())对结果进行排序。

 

五、使用Hibernate完成增删改的步骤:

1、创建hibernate配置文件,默认文件名为hibernate.cfg.xml,包括四个部分的内容:数据库连接信息;Hibernate相关特性;连接池相关配置;实体类映射文件的路径

2、创建实体类

3、创建和配置映射文件

4、将映射文件添加到主配置文件中

5、进行测试

6、数据库操作,包括7个步骤:添加Configuration配置;创建SessionFactory;打开Session ;开始一个事务;持久化操作(save/update/delete/get);提交事务;关闭Session

六、Hibernate的延迟加载

       延迟加载是指:主对象的关联对象和关联集合并不是立即抓取的,加载主对象时,它们还是一个代理,只有需要使用到这些对象时,才会对它们加载。

      涉及到加载计划(何时加载)的关注点有以下几个:

             主对象的关联对象何时被加载;

             主对象的关联集合何时被加载; 

             主对象本身何时被加载;

             主对象的属性何时被加载。
      对于关联对象和关联集合,默认情况下Hibernate会采用延迟加载,它是按需加载;

       对于主对象本身,它是否延迟加载取决于使用的方法,load()方法会延迟加载,得到代理对象,只有使用时才会触发查询的发生,而get()方法是立即获取对象本身。

       对于主对象的属性,它在默认情况下是被立即加载的。

 



 


 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值