2.hibernate 核心接口

来源:互联网 发布:日历记事软件 编辑:程序博客网 时间:2024/05/15 23:51

这里写图片描述

hibernate对jdbc API进行了封装,提供了更加面向对象的API。

public static void main(String[] args) throws Exception      {          //1.实例化Configuration           Configuration conf = new Configuration().configure();          //2.实例化SessionFactory           SessionFactory sf = conf.buildSessionFactory();          //3.实例化Session           Session sess = sf.openSession();          //4.开始事务           Transaction tx = sess.beginTransaction();          //5.创建消息实例           News n = new News();          //6.设置消息标题和消息内容           n.setTitle("疯狂Java联盟成立了");          n.setContent("疯狂Java联盟成立了,网址是www.crazyit.org");          //7.保存消息           sess.save(n);          //8.提交事务           tx.commit();          //9.关闭Session           sess.close();      }  

1.Configuration接口:

用于配置并启动hibernate

这里写图片描述

Configuration类的主要作用是解析Hibernate的配置文件持久化映射文件中的信息,然后通过Configuration对象的buildSessionFactory()方法创建SessionFactory对象,所以Configuration对象一般只有在获取SessionFactory对象时需要使用。当获取了SessionFactory对象之后,由于配置信息已经由Hibernate 维护并绑定在返回的SessionFactory中,因此该Configuration已无使用价值。

我们可以查看Configuration的源代码,它的configure()方法是这样实现的:

public Configuration configure() throwsHibernateException {         configure("/hibernate.cfg.xml" );//此处指定了ORM文件的位置         return this;     }  

我们看到它是在这里指定了ORM文件的位置,这就是为什么Hibernate总是默认到classpath下去寻找hibernate.cfg.xml文件的原因了。实际上我们还可以通过configure(String resource)来动态的指定配置文件,只不过通常我们都是采用的默认设置罢了。这样的话我们的配置文件就都被读取了,同时配置文件中通过元素引入的映射文件也被读取了。

2.SessionFactory接口:

SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory**并不是轻量级**的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

这里写图片描述

SessionFactory有以下特点:

  • 它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享。
  • 它是重量级的,这意味着不能随意创建或销毁它的实例。如果应用中只访问一个数据库,只需要创建一个SessionFactory实例,在应用初始化的时候创建该实例。如果应用同时访问多个数据库,则需要为每一个数据库创建一个单独的SessionFactory实例。
  • 之所以称SessionFactory是重量级的,是因为它需要一个很大的缓存,用来存放预定义的sql语句及映射元数据等。用户还可以为SessionFactory配置一个缓存插件,这个缓存插件被称为Hibernate的第二级缓存,该缓存用来存放被工作单元读过的数据,将来其他工作单元可能会重用这些数据,因此这个缓存中的数据能够被所有工作单元共享。一个工作单元通常对应一个数据库事务。
    这个实例中有一个getCurrentSession()方法获得一个session。在老的api中我们也会用openSession方法获取session,这种方法现在不提倡再用了,因为他永远只会产生一个新的session,并且他需要你手动将其close掉,而getCurrentSession()方法在你这个session还没有提交之前你无论拿多少次,他始终都是同一个session,session一旦提交那再拿就是一个新的session了,也就是他首先会在上下文中去找session,如果没有找到就会新建一个新的session,并且他在提交完事务后自动close掉。

3.Session接口:

对于Hibernate开发人员来说是一个最重要的接口,被称为持久化管理器,提供了持久化的相关操作:保存、更新、删除、加载对象。Hibernate操作数据库之前必须先获取一个Session对象,相当于JDBC在操作数据库之前必须获取一个Connection对象一样。

获取Session对象后,Hibernate内部并不会获取操作数据库的java.sql.Connection对象,而是等待Session对象真正需要对数据库进行CRUD等操作时,才会从数据库连接池中获取java.sql.Connection对象。而关闭Session对象时,则是将java.sql.Connection对象返回到连接池中,而不是直接关闭java.sql.Connection对象。
Session对象是非线程安全的,因此在你的设计中,最好是一个线程只创建一个Session对象。 session可以看作介于数据连接与事务管理一种中间接口。


4.Transaction接口:

Hibernate数据库事物接口。Transaction接口负责事务相关的操作,一般在Hibernate的增删改中出现,但是使用Hibernate的人一般使用Spring去管理事务。

5. Query接口:

是Hibernate的查询接口,用于向数据库查询对象以及控制执行查询的过程。Query实例包装了一个HQL(Hibernate Query Language)查询语句。HQL查询语句与SQL相似,HQL面向对象,引用类名和类的属性名,而不是表名和字段名。

参考:http://www.ibm.com/developerworks/cn/java/l-hibernate1/

0 0
原创粉丝点击