Hibernate是一种对JDBC做了轻量级封装的对象---关系映射工具,所谓轻量级封装,是指Hibernate并没有完全封装JDBC,Java应用即可以通过Hibernate API访问数据库,还可以绕过Hibernate API,直接通过JDBC API来访问数据库。
-----摘自Hibernate文档
前一篇文章中的例子中基本上已经涵盖了对数据库的增删改查操作,我们通过Hibernate操纵数据库时应该按照一个什么样的步骤来呢?要用到Hibernate的哪些API呢?一般来说,所有的Hibernate应用都会访问6个核心接口或者类,它们是:Configuration、SessionFactory、Session、Transaction、Query和Criteria,它们的关系如下图所示。
- static{
- try{
- Configuration configuration=new Configuration();
- sessionFactory=
- configuration.configure().buildSessionFactory();
- }
- catch(Exception e){
- e.printStackTrace();
- }
- finally{
- }
- }
- //以saveCustomer方法为例来进行阐述
- public void saveCustomer(Customer customer){
- Session session=sessionFactory.openSession();
- Transaction tx = null;//局部变量必须赋予初始值
- try{
- tx=session.beginTransaction();
- //事务开始
- session.save(customer);
- tx.commit();
- }
- catch(Exception e){
- if(tx!=null) tx.rollback();
- e.printStackTrace();
- }
- finally{
- session.close();
- }
- }
从上面的代码可以看出,我们首先会执行静态块里面的代码,它的作用就是创建一个Configuration对性和SessionFactory对象:
1.Configuration configuration=new Configuration();
2.sessionFactory=configuration.configure().buildSessionFactory();
这和我们图中所描述的顺序是一致的。下面看我们的saveCustomer方法,在这个方法里面我们进行了如下两个步骤:
3.Session session=sessionFactory.openSession();
4.Transaction tx=session.beginTransaction ();
在这几个步骤之后再调用Session接口的save方法向数据库中写入数据,由于这个方法没有执行查询操作,所以就没有用到Query接口和Criteria接口。那么这几个接口或者类具体起什么作用呢?
一.Configuration
Configuration对象用于配置并根启动Hibernate。Hibernate应用通过Configuration实例来指定对象—关系映射文件的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例。注意蓝色背景的文字,Configuration实例是什么时候指定ORM文件的地址的呢?我们可以查看Configuration的源代码,它的configure()方法是这样实现的:
public Configuration configure() throws HibernateException {
configure( "/hibernate.cfg.xml" );//此处指定了ORM文件的位置
return this;
}
原来它是在这里指定了ORM文件的位置,这就是为什么Hibernate总是默认到classpath下去寻找hibernate.cfg.xml文件的原因了。实际上我们还可以通过configure(String resource)来动态的指定配置文件,只不过通常我们都是采用的默认设置罢了。这样的话我们的配置文件就都被读取了,同时配置文件中通过<mapping>元素引入的映射文件也被读取了。
二.SessionFacory
前面我们已经说Configuration负责创建SessionFactory实例,那么创建的时候有什么动作呢?我们可以查看Configuration的buildSessionFactory方法,这个方法把Configuration对象所包含的所有配置信息都拷贝到SessionFactory对象的缓存当中了,并且SessionFactory对象创建之后就不再和Configuration对象关联了。那么SessionFactory对象是干什么用的呢?一般而言,一个SessionFactory对象就代表一个数据库存储源,通常一个应用程序只需要创建一个SessionFactory实例即可。由此我们看出SessionFactory具备如下两个特点:
1. 线程安全。整个应用共用一个SessionFactory实例。
2. 重量级。在SessionFactory中存放了Hibernate配置信息以及映射元素据信息,这些都需要很大的缓存。
一般来说,SessionFactory的主要作用就是创建Session对象,所有的线程都是从SessionFactory中获取Session对象来处理客户请求的。
三.Session
这个可以说是被使用最多了,只要涉及到增删改查,都离不开Session实例,前面我们也已经说了所有的线程都是从SessionFactory中获取Session对象来处理客户请求的,因此Session的每个方法都值得我们去研究和探讨,不过最常用的还是save、saveOrUpdate、update、delete、createQuery等方法了,关于Session是如何作用的以及它的工作原理在以后的实践中再一步一步的进行学习和探讨,至于其它的如Query、Transaction等都是和Session结合在的一起使用的,在这里也就不多说了。
实际上上图的表述不是很准确,因为除了Configuration之外其它的都是接口,接口是不能被实例化的,只能说是创建了一个这个接口类型的实例。从前面的文章中摘取几个代码片段来看: