• Hibernate 学习笔记第二篇


    Hibernate 的核心类和接口

      1> Configuration 类:

          Configruation类是Hibernate 的入口,它负责配置并启动Hibernate。Hibernate 框架通过Configuration 

          实例加载配置文件信息,然后读取指定对象关系映射文件内容并创建SessionFactory实例。

      2> SessionFactory 接口:

          SessionFactory 接口负责初始化Hibernate, 一个SessionFactory 实例对应一个数据库存储源(一般指一个数据库),

          应用程序从SessionFactory 中获取Session实例,SessionFactory 有以下特点。

           2.1> 线程安全,同一个SessionFactory 实例可以被多个线程共享。

           2.2> 它是重量级的,因为它需要一个很大的缓存,用来存储预定的SQL语句和映射元数据。

           注:如果一个应用程序只访问一个数据库只需要创建一个SessionFacory。

      3> Session接口:

         Session  是hibernate 应用中使用最为频繁的接口之一,Session被称为执久化管理器,负责所有的执久化工作。

         如:存储,更新,删除,加载对象等。Session有以下特点:

           3.1> 单线程:非共享对象。线程不安全,在设计软件架构时,应避免多个线程共享一个Session。

           3.2> session是轻量级的,它的创建和销毁不需要消耗太多的资源,可以给每个请求配置一个Session,

                在每次请求过程中及时的创建和销毁Session实例。

           3.3> session 有一个缓存,它存入了当前工作单元加载过的对象,session缓存被称为Hibernate的一级缓存。

      4> Transaction 接口:

          Transaction接口是负责hibernate事务的,它对底层的事务接口做了封装,包括JDBC JTA,这样有利于一致的transaction

          接口来声明事务的边界。

      5> Query 和Criteria 接口

         它们是Hibernate 查询接口,用于从数据库存储源查询对象及控制查询过程。

         Query 包装了一个HQL(Hibernate Query language)。

     整体执行过程:

           Configuration config = new Configuration().configure("hibernate.cfg.xml");   

           SessionFactory sessionFacory = config.bulidSessionFacory();

           Session session = sessionFactory.openSession();

           Transaction transaction = session.beginTransaction();

             transaction.begin();

             session.save(Object);

             transaction.commit()

           transaction.close();

           session.close();

           sessionFacory.close();

        启动hibernate-->创建SessionFactory-->开启Session-->开启Transaction-->执行执久化操作-->关闭Transaction-->关闭Session-->关闭SessionFactory。

     执久化对象的生命周期:

     一个执久化类的实例,在持久化生命周期中会在不同的状态间转变,Hibernate 定义了四种状态。

    瞬时状态(transient)

      实例是通过new 语句创建的的,没有与session关联,与数据库中没有对应的标识,如果超出作用范围将被垃圾回收。

    持久状态(persistent)

     实例己经被持久化,与session关联,且session没有关闭,在数据库中有对应的标识。

    移除状态(removed)

     如果有一个对象已经计划在一个session 上下文结束时删除,它就处于删除状态,仍然处于session的管理中,直到工作单元结束,同步到数据库,删除对应标识。

    脱管状态(detached)

     实例不在session 的管理范围内,数据库有对应的标识。

     

    结构图如下:

     

      

      Session的基本操作:

       Session是Hibernate 中一个重要的持久化管理器,用它完成对对象的CRUD操作、持行查询、事务操作,Session执行持久化操作时,都声明可能会的抛出的异常。

       HibernateException可以处理也可不去理会,所以HibernateException 是一个非受检异常。

       Session方法介绍:

        public Serializable save(Object obj) throws HibernateException;持久化给定的瞬时实体,并返回该实例的对象标识符值。

         当调用save()方法时,完成以下步骤:

         1> 把瞬时对应加入到当前Session的缓存中,它便是持久化对应了。

         2> 使用主键生成策略为此持久化对象分本唯一的OID.

         3> 计划执行insert 语句,把该持久化对象保存到数据库,只有清除当前Session时才会执行insert语句,

            如果在清除当前Session时修改了持久化对象,那么Session清除缓存时会额外的持行一条SQL update语句。

            

     public Object get(Class clazz,Serializable OID) throws HibernateException;根据给定的OID返回持久化对象。

      get() 方法会查询当前Session中是否存该对应,如果存在就返回,不存在去二级缓存中查找,如果二级缓存还是不存中就会去数据库中查找,

         如果数据库不存就返回null。

     public Object load(Class clazz,Serializable OID) throws HibernateException; 根据IOD返回执久化对象。

      load()方法会查询当前Session中是否存该对应,如果存在就返回,不存在去二级缓存中查找,如果存在就返回,如果还是不存在,hibernate 

       框架就会创建一个代理对象返回,这个代理对象只包含一个标识符,其他的属性为空。所谓的懒加载。(查询实体类没有定义成final 否则不会有懒加载),

       直到必须使用此对象时才会到数据库中查询。如果数据库不存就会抛出异常 ObjectNotFoundException。

       说明:产生代码对象的说明:

         在hibernate 3.2版本前使用的是cglib,而hibernate 3.3后就换成了javassist 。本例使用hibernate3.3

         如下图所示:

          

         如果需要手机的更改成cglib 则需要在hibernate.properties中添加

         hibernate.bytecode.provider=cglib

         用来指定字节码处理机制

         如下图所示:

      

     public void delete(Object object) throws HibernateException; 把指定的执久化实例转换顾瞬时状态,并从数据表中移除对应的记录。

     public void update(Object obj) throws HibernateException;把脱管对象加入到当前session中,并把它执久化到数据库中。

     public Oject merge(Object ojb) throws HibernateException;将对象的实例的状态复制到具有相同标识的执久化实例上,并返回这个执久化对象。

          

  • 相关阅读:
    通过json动态创建控制器
    记一次bug解决!改变思路解决问题的同时,还需要弄明白是什么原因。
    __proto__,prototype,constructor
    事件:compositionstart & compositionend,解决oninput获取到拼音的问题。
    事件绑定----阻止冒泡失效
    预装的win10系统如何恢复
    rem.js
    vscode 使用 github仓库
    nginx使用
    伸缩盒
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218410.html
Copyright © 2020-2023  润新知