hibernate核心接口介绍

来源:互联网 发布:淘宝 无盒 瑕疵 化妆品 编辑:程序博客网 时间:2024/06/11 17:13

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。Hibernate核心接口一共有5个,分别为:Session、SessionFactory、Transaction、Query和Configuration。这5个Hibernate核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。


                       图1 Hibernate核心接口的层次架构关系


Configuration 接口

Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。

虽然Configuration接口在整个Hibernate项目中只扮演着一个很小的角色,但它是启动hibernate时你所遇到的每一个对象。

a. 属性文件(hibernate.properties):Configuration cfg = new Configuration();
     Xml文件(hibernate.cfg.xml):Configuration cfg = new Configuration().configure();
     b. 当然也可以用File对象来初始化配置文件,这样就不需要非的是hibernate.cfg.xml的文件名了。如下代码:
         File file=new File("d:/hibernamte2.cfg.xml");
         Configuration configure = new Configuration().configure(file);

     c.  另外一种更常用,就是用URL,如下代码:
         URL url = new URL(http://localhost/hibernate2.cfg.xml);
         Configuration configure = new Configuration().configure(url);

重要方法:
public Configuration configure (String resource)throws HibernateException;在参数中指定要加载的XML格式的配置文件
public Configuration configure(URL url)thrwos HibernateException:
public SessionFactory buildSessionFactory() throws HiberanteExcepiton: 根据配置文件实例化一个新的SessionFactory对象,这个SessionFactory将是不可变的,所以在创建了SessionFactory对象后,对Configuration对象作出的所有修改不会影响以前创建出的SessionFactory对象。

Configuration对象的作用是除了有读取配置文件的功能,还能创建SessionFactory对象。通常,一个应用程序会创建一个Configuration对象,然后利用Configuration实例建立唯一的SessionFactory实例,这就意味着Configuration对象只存在于系统的 初始化阶段,然后所有的持久化操作都能通过这个唯一的SessionFactory实例来进行。
Configuration对象只有在Hibernate 进行初始化的时候才需要创建,当使用Configuration对象的实例创建了SessionFactory对象的实例后,其配置信息已经绑定在他返回的SessionFactory对象实例中。因此,一般情况下,得到SessionFactory对象后,Configuration对象的使命就结束了。


  SessionFactory 接口

这里用到了一个设计模式――工厂模式,用户程序从工厂类SessionFactory中取得Session的实例。

SessionFactory不是轻量级的!它的设计者的意图是让它能在整个应用共享。典型地来说,一个项目通常只需要一个SessionFactory就够了,但是当你的项目要操作多个数据库时,那你必须为每个数据库指定一个SessionFactory。

一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。

它具有如下特点:

1)它是线程安全的,这意味着它的同一个实例可以被应用的各个线程共享。

2)它是重量级的,这意味着不能随意创建或销毁它的实例。如果应用只访问一个数据库,只需创建一个SessionFactory实例,在应用初始化的时候创建该实例。如果应用同时访 问多个数据库,则需要为每个数据库创建一个单独的SessionFactory实例。

3)以后对Configuration对象势力作出的修改都不会影响已经创建好的SessionFactory实例,如果需要使用基于改动后的Configuration实例的SessionFactory,需要从Configuration对象中重新创建新的SessionFactory实例。

之所以说SessionFactory是重量级的,是因为它需要一个很大的缓存,用来存放预定义的SQL语句以及映射元数据等。用户还可以为SessionFactory配置一个缓存插件,这个缓存插件被称为Hibernate的第二级缓存,该缓存用来存放被工作单元读过的数据,将来其它工作单元可能会重用这些数据,因此这个缓存中的数据能够被所有工作单元共享,一个工作单元通常对应一个数据库事务。

SessionFactory接口负责初始化Hibernate。

重要方法:

public Sessioin openSession() throws HIbernateException:创建一个数据库连接,并把他放在Session对象中,并返回

public Session openSession(Connection connection):创建一个Session对象,并把参数给出的 connection对象放在其中

public boolean isClosed():判断当前SessionFactory对象是否关闭了

public void close() throws HibernateException 关闭SessionFactory以及释放所有的SessionFactory涉及到的资源(缓存,数据库连接池等)但在调用此方法之前,应该确定没有当前对象创建的 Session没有关闭


Session接口

Session接口对于Hibernate 开发人员来说是一个最重要的接口。然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。这在实际项目中  确实很重要,因为在客户程序中,可能会不断地创建以及销毁Session对象,如果Session的开销太大,会给系统带来不良影响。Session具有一下特点:

1)不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例;

2)Session实例是轻量级的,所谓轻量级,是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建和销毁Session对象,例如为每个客户请求分配单独的 Session实例,或者为每个工作单元分配单独的Session实例。

3)Session有一个缓存,被称为Hibernate的第一级缓存,它存放被当前工作单元加载的对象。每个Session实例都有自己的缓存,这个Session实例的缓存只能被当前工作单元访问。Session接口负责执行被持久化对象的CRUD操作 (CRUD的任务是完成与数据库的交流,添加、更新、删除、加载和查询对象,包含了很多常见的SQL语句。)。

在Hibernate的设计者的头脑中,他们将session看作介于数据连接与事务管理一种中间接口。我们可以将session想象成一个持久对象的缓冲区,Hibernate能检测到这些持久对象的改变,并及时刷新数据库。我们有时也称Session是一个持久层管理器,因为它包含这一些持久层相关的操作,诸如存储持久对象至数据库,以及从数据库中获得它们。请注意,Hibernate 的session不同于JSP应用中的HttpSession。以后会将HttpSesion对象称为用户session。

重要方法:

public Transaction beginTransaction() throws HibernateException:返回和当前Session对象相互联系的Transaction对象(表示在数据库中重新开始一个事务)

public Transaction getTransaction() 返回和当前session联系的Transaction对象

public Connection connection close() throws HibernateExcepton:结束当前的Session对象

public void clear() :清空Session,清除所有保存在当前Session缓存中的实体对象,终止所有正在执行的方法(eg: save() , update() ,delete() .....)

public Serializable save(Object object)throws HibernateException 对当前参数指定的对象进行持久化(系统会首先赋予参数对象一个标识符OID),他相当于insert语句 后面在详细介绍

public Connection connection() throws HibernateException 得到当前Session 中包含的Connection对象。

public boolean contains(Object object):判断参数给出的对象(持久化类)是否在当前Session的缓存中 

public void evict(Object object) throws HibernateException :将参数给出的Object从当前Session对象类中删除,使这个对象从持久态变成游离态,这种状态的改变不会引起对数据库的同步

                public Object load(Class theclass ,Serializable id) throws HibernateException 返回第一个参数指定类对应的表中,第二个参数指定的行(第二个参数就是要取得对象的OID,他对应表中主键列的

public void update(Object object) throws HibernateException :更新一个对象到数据库中,后面在详细介绍


public void delete (Object object)throws HibernateException:从数据库中删除和参数指定的对象对应的记录


public Object get(Class class,Serializable id) throws HibernateException:和load()方法一样区别在于,如果数据库表中没有对应的记录,get()方法返回null,load()方法将报异常 


     Session session = sessionFactory.openSession();

     Session session = sessionFactory.getCurrentSession();

   区别(重要):

    1、调用getCurrentSession()会从上下文(thread或JTA)中找session对象,如果有就用旧的,没有就产生新的对象,openSession()每次调用产生的是新的session对象。

    2、采用getCurrentSession()创建的Session会绑定到当前的线程中去,使用openSession()创建session对象不会绑定到当前线程中去。

   3、采用getCurrentSession()创建的Session在事务结束后会自动关闭,采用OpenSession()必须手动关闭。

    采用getCurrentSession()需要在Hibernate.cfg.xml配置文件中加入如下配置:
    如果是本地事物,及JDBC一个数据库:
    <propety name=”Hibernate.current_session_context_class”>thread</propety>
    如果是全局事物,及jta事物、多个数据库资源或事物资源:
    <propety name=”Hibernate.current_session_context_class”>jta</propety>


   Transaction 接口

Transaction接口是一个可选的API,你可以选择不使用这个接口,取而代之的是Hibernate的设计者自己写的底层事务处理代码。它将应用代码从底层的事务实现中抽象出来——这可能是一个JDBC事务(Connection事务,基于数据库的事务),一个JTA事务(基于分布式的事务,同时管理多个数据库之间的事务)或者甚至是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。

Transaction tx = session.beginTransaction();
注:使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)。
重要方法:
public void commit() throws HibernateException 刷新当前的Session以及结束事务的工作,这个方法将迫使数据库对当前的事务进行提交
public void rollback() throws HibernateException :强迫回滚当前事务
public boolean isActive() throws HibernateException: 这个事务是否存活


Query和Criteria接口

它们是Hibernate的查询接口,用于向数据库查询对象,以及控制执行查询的过程。query实例封装了一个HQL(Hibernate Query Language)查询语句,HQL是面向对象的,它引用类名及类的属性名,而不是表名及表的字段名。Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更加面向对象,Criteria接口更擅长于执行动态查询。 Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。

Criteria接口与Query接口非常类似,它允许你创建并执行面向对象的标准化查询。

值得注意的是Query接口也是轻量级的,它不能在Session之外使用。Session接口的find()方法也具有数据查询功能,但它只是执行一些简单的HQL查询语句的快捷方法,它的功能远没有Query接口强大。

Callback 接口

当一些有用的事件发生时――例如持久对象的载入、存储、删除时,Callback接口会通知Hibernate去接收一个通知消息。一般而言,Callback接口在用户程序中并不是必须的,但要在项目中创建审计日志时,可能会用到它。

原创粉丝点击