Hibernate系列之核心开发接口

一、概述

  所有的hibernate应用中都会访问5个核心接口,它们分别是:

  • Configuration:配置hibernate,创建SessionFactory对象
  • SessionFactory:初始化hibernate,充当数据存储源的代理,创建Session对象
  • Session:负责保存、更新、删除、加载和查询对象
  • Transaction:管理事事务
  • Query和Criteria:执行数据库查询

  下面将对这五个接口进行逐一总结:  

二、Configuration

  一个Configuration的实例允许应用指定在创建一个SessionFactory时使用的属性和映射文件,通常一个应用将创建一个单独的Configuration,构建一个SessionFactory的单一实例然后实例化会话线程用于服务客户请求。Configuration仅仅是作为一个初始化时的对象,一个Configeration 实例代表Hibernate 所有Java类到Sql数据库映射的集合。

  Configuration主要用于产生SessionFactory,进行配置信息的管理,可以在configure方法中指定hibernate文件。

  在Hibernate 4之前的版本中,Configuration是通过下述方式产生SessionFactory的:

SessionFactory sf=new AnnotationConfiguration().configure().buildSessionFactory();

  Hibernate 4以后,Configuration的buildSessionFactory方法被标记为过时,官方建议使用buildSessionFactory(ServiceRegistry sr)这个方法来获取SessionFactory。

 Configuration configuration = new Configuration().configure();
 ServiceRegistry sr=new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
 SessionFactory sessionFactory = configuration.buildSessionFactory(sr); 

三、SessoinFactory

  SessionFactory的主要作用是产生和管理Session,通常情况下每一个应用只需要一个SessionFactory,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

  一个SessionFactory的内部状态是不可变的,一旦创建了这个内部状态的内部设置便不再与Configuration对象关联,这种状态包括所有关于对象/关系映射数据。

  SessionFactory在Hibernate中起到一个缓冲区的作用,它缓冲了Hibernate自动生成的SQL语句和一些其他的映射数据。

  SessionFactory可以通过两种方法getCurrentSession()和openSession()产生Session,两种方法的区别有:

  1. openSession每次打开都是新的Session,并且需要人为的调用close方法关闭Session。
  2. getCurrentSession是从当前上下文中获取Session并且会绑定到当前线程,第一次调用会自动创建一个Session实例,如果未手动关闭多次获取的是同一个Session,事物提交或者回滚时会自动关闭Session。
  3. 使用getCurrentSession时,需要在配置文件中添加如下:

  (1)如果使用的是本地事务(JDBC事务)

 <property name="current_session_context_class">thread</property>

  (2)如果使用的是全局事务(JTA事务)

<property name="current_session_context_class">jta</property>

  备注:

  全局事务:资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用XA 二阶段提交协议与“企业信息系统”(EIS) 或数据库进行交互。   

  本地事务:在单个 EIS或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。

  使用getCurrentSession()方法时,如果未配置上述属性,则会报错:

  

四、Session

  Session用于管理一个数据库的任务单元(增、删、改、查),它是Java应用和Hibernate之间主要运行接口,是抽象持久性服务概念的主要API。

  Session的生命周期是以一个逻辑事物的开始和结束为边界,Session的主要功能是提供创建、读取和删除映射的实体类的操作,实体可能存在于三种状态:

  1. 瞬时状态(transient)

  即为普通的Java对象,此状态下,不与Session实例关联,在数据库中没有和瞬时对象关联的数据

  2.  持久状态(persistent)

  处于此状态的实例在数据库中对应的记录,并拥有一个持久化标识。持久状态的对象总是与Session和Transaction相关联,在一个Session中,对持久对象的改变不会马上对数据库进行变更,而是发生在Transaction终止,执行commit之后。

  3.  游离状态(detached)

  与持久状态的对象关联的Session被关闭后,该对象就变成游离状态,此状态下对游离对象的引用依然有效,也可以继续被修改。

  这三种状态之间可以相互转换,如下图示:

  

  Session中有一个缓存,被称为hibernate的第一季缓存,它存放被当前工作单元加载的对象,这块缓存中有一map,在执行save方法后,会生成一个id,这个id会保存在map的key中,与之对应的value值就是该是该对象的引用,执行commit()方法后,数据库就有对应这条数据了,此时该实体处于持久化状态,当执行完Session.close()后,处于托管状态。

  区分这三种状态的关键在于:

  • 有没有ID
  • ID在数据库中有没有
  • 在内存中没有

  瞬时状态下,为内存中一个对象没有ID,缓存中也没有

  持久化状态,内存有,缓存中有,数据库中也存在

  托管状态:内存中有,缓存中没有,数据库中存在ID

  Session接口有几个重要的方法:

  save():持久化给出的瞬时状态的实体,并分配有一个ID标识符

@Test
    public void test()
    {
        Session session=HibernateUtil.getSessionFactory().getCurrentSession();
        Book b=new Book();
        b.setBookName("Java");
        b.setId(1);
        b.setPrice(21);
        session.beginTransaction();
        session.save(b);
        session.getTransaction().commit();
    }

  Delete():从数据库中删除持久化实体

@Test
    public void test()
    {
        Session session=HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Book b=(Book) session.get(Book.class, 1);
        session.delete(b);
        session.getTransaction().commit();
    }

  load():返回给定标识符的实体类的持久化实例(假定实例存在),不能使用该方法来确定一个实例是否存在(使用get方法)

@Test
    public void test()
    {
        Session session=HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Book b=(Book) session.load(Book.class, 1);
        System.out.println(b.getBookName());
        session.getTransaction().commit();
    }

  get():返回给定标识符的实体类的持久化实例或null(如果实例不存在)

@Test
    public void test()
    {
        Session session=HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Book b=(Book) session.get(Book.class, 1);
        session.getTransaction().commit();
        System.out.println(b.getBookName());
    }

  get()和load()方法的区别

  1. 当对应记录不存在时,使用load方法会报异常,而get方法会返回null

  

  

  2.  load返回的是代理对象,等到真正用到对象的内容时才发出sql语句,而get直接从数据库加载,不会延迟

  update():更新指定标识符的托管状态实例为持久化状态,如果存在具有相同标识符的持久化实例,将会报异常

五、Transaction

  Hibernate的Transaction是底层的JDBC Transaction或者JTA Transaction的封装,具体取决于在hibernate.properties中的配置。

  一个典型的事务在创建完Session对象后即使用beginTransaction()启动事务,从此开始知道commit()之间的代码都会处于同一个事务中,这两个函数之间的所有的数据库代码都会在commit()执行时一次性提交,在提交时如果某一句代码执行出现异常,就会回滚这一次事务之间的所有执行代码。

六、Query

  通过SessionFactory获得了session对象后,除了可以通过get(类名.class, id)方法得到相应的对象,还可以通过获得Query对象来取得需要的对象:

  Query query = session.createQuery("查询语句如from UserBean");
    List list = query.list();//得到一个集合
  query.uniqueResult();//得到一个单个的对象

   分页查询:

   query.setFirstResult(位置);//表示从哪个位置开始查询,返回query对象
   query.setMaxResult(记录条数);//表示当页共几条记录,返回一个集合
   session.createQuery("select count(*) from 类名").uniqueResult();//得到记录总数

  查询语句同sql查询语句很相像,只是将表名换作类名,字段名换作属性名,如果查询需要条件可以使用占位符来替换对应的属性名,也可以使用:变量名来作为占位符。

  eg:

@Test
    public void test1()
    {
        Session session=HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query q=(Query) session.createQuery("from Person");
        List<Person> persons=(List<Person>)q.list();
        for(Person p:persons)
            System.out.println(p.getName());
        session.getTransaction().commit();
    }
public void test2()
    {
        Session session=HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query q=(Query) session.createQuery("select count(*) from Person");//得到记录总数
        int count=((Long)q.uniqueResult()).intValue();
        System.out.println(count);
        session.getTransaction().commit();
    }
时间: 2024-11-03 01:33:59

Hibernate系列之核心开发接口的相关文章

Hibernate 再接触 核心开发接口

1.可以重载方法进行配置文件的指定 sessionFactory = new AnnotationConfiguration().configure("hibernate.xml").buildSessionFactory(); 这样读取到的就是hibernate.xml 但一般不建议修改 getcurrentsession 指的是上下文如果没有提交 就不会创建新的session opensession 永远打开新的session 用于鉴定事务边界 比如加入日志操作等 事务:要么同时完

核心开发接口介绍

核心开发接口介绍1.hibernate_0500_CoreAPI2.HiberanteAPI 文档需要单独下载 在线api链接:http://docs.jboss.org/hibernate/core/3.3/api3.Configuration a) AnnotationConfiguration b) 进行配置信息的管理 c) 用来产生 SessionFactory d) 可以在 configure方法中指定hibernate配置文件 e) 只需关注一个方法即:buildSessionFac

hibernate(五)核心开发接口

一.Configuration 1.AnnotationConfiguration 2.进行配置信息的管理 3.configure()方法通过传入一个配置文件来使用例:new Configutayion.configure("myhibernateconfig.xml")...如果不传入配置文件则默认为hibernate.cfg.xml 二.SessionFactory 1.维护着数据库的连接池,当它产生一个session的时候就是从数据库连接池中捡出一个连接交给这个session.

Hibernate核心开发接口_SessionFactory详解

SessionFactory: a)  用来产生和管理Session b)通常情况下每个应用只需要一个SessionFactory c)除非要访问多个数据库的情况 d) 关注两个方法即:  openSession    和 getCurrentSession i.   openSession 每次都是新的,需要close ii.  getCurrentSession 从上下文找,如果有,用旧的,如果没有,建新的 1,用途,界定事务边界 2,事务提交自动close 注:上下文是什么?当前sessi

hibernate核心开发接口_Configuration

AnnotationConfiguration继承自Configuration,这里以AnnotationConfiguration为例: new AnnotationConfiguration().configure().buildSessionFactory(); AnnotationConfiguration().configure()会默认找src下的hibernate.cfg.xml,读取配置信息. * 最主要的是数据库连接信息,帮你做出连接池.SessionFactory代表着跟数据

【SSH进阶之路】Hibernate系列——总结篇(九)

这篇博文是Hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我们也说它是数据持久层的框架. 我们从上一句话可以看出Hibernate的核心:面向对象.关系映射以及数据持久化.前面两个概念很容易理解,而对于"数据持久化",就是将数据或者某物体,永久的保存起来.现实生活中的例子有很多,例如:鲜肉冷藏,水果做成罐头,而对于编程而言就是将数据保存在文件或磁盘

(Hibernate进阶)Hibernate系列——总结篇(九)

这篇博文是hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我们也说它是数据持久层的框架. 我们从上一句话可以看出Hibernate的核心:面向对象.关系映射以及数据持久化.前面两个概念很容易理解,而对于"数据持久化",就是将数据或者某物体,永久的保存起来.现实生活中的例子有很多,例如:鲜肉冷藏,水果做成罐头,而对于编程而言就是将数据保存在文件或磁盘

Hibernate学习笔记--核心编程

参考资料:Java Web核心框架 http://blog.csdn.net/lsh6688/article/details/7611950 Part 1.hibernate核心接口层次架构关系 图:hibernate核心接口层次架构关系 上图中,Hibernate的接口大致可以分为以下几种类型: 1. 基本操作类:一些被用户的应用程序调用的,用来完成基本的创建.读取.更新.删除操作以及查询操作的接口.这些接口是Hibernate实现用户程序的商业逻辑的主要接口,它们包括Session.Tran

Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解

在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基本配置.核心API的底层实现和源码解析将在以后的博客中一一为大家讲解. 首先我们一起来看一下开发一个hibernate应用程序的大体流程是什么样的(流程顺序可以颠倒): •创建Hibernate的配置文件 •创建持久化类 •创建对象-关系映射文件 •通过Hibernate API编写访问数据库的代码 关于配置