初次邂逅Hibernate之进一步了解

来源:互联网 发布:一维数组的概念 编辑:程序博客网 时间:2024/06/04 19:54

在:http://blog.csdn.net/qq_21231581/article/details/51811995中我们将Hibernate的环境配置好,并且做了一个简单的数据库插入bean对象的操作。对其中cfg.xml或API代码不甚知晓,然而知其然不知其所以然是不行的,所以这次我把一些Hibernate配置及代码进行整理解释,以便记忆及分享。

1.cfg.xml文件常见属性介绍

       hibernate.show_sql:设置为true时,Hibernate运行时在控制台输出被执行的SQL语句,方便开发时使用

       hibernate.format_sql:设置为true时,输出的SQL语句进行排版,方便查看

       hbm2ddl.auto:

                 设置validate:加载hibernate时,验证创建数据库表结构

                 设置create:每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。

                       设置update:加载hibernate自动更新数据库结构

                 设置create-drop: 在create的基础之上,同时系统关闭前执行drop

       hibernate.dialect:配置数据库方言,Hibernate会据此作出对应的优化

      hibernate.default_schema:默认的数据库

2.Session简介

       刚接触Session我也有点不明其用处,在写代码的过程中逐步了解,我把它当做JDBC中的connection来看待:用她可以执行数据库的增删查改操作(save(),update(),delete(),createQuery())等,

       当然,获取Session对象也需要简单的几步:

               1.加载cfg.xml文件的信息,即创建Configuration对象:     

             Configuration config = new Configuration().configure();
               2.通过Configuration对象的属性信息创建ServiceRegistry服务注册对象:

            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()                                               .applySettings(config.getProperties())                 .buildServiceRegistry();

              3.通过Configuration及ServiceRegistry创建SessionFactory工厂对象:

this.sessionFactory = config.buildSessionFactory(serviceRegistry);
              4.接下来就可以通过SessionFactory创建Session对象,而创建Session对象的API方法有2种:

                          第一种: 

this.session = sessionFactory.openSession();

                          第二种:需要在cfg.xml文件中如下配置

                    <property name="current_session_context_class">thread</property>
                          该属性有thread,jta,manage,custom等,thread最常用,接着代码中如下:

this.session = sessionFactory.getCurrentSession();

                          二者的区别:

                                getCurentSession()类似于单例模式,每次获取的Session(包括Connection)都是同一个内存对象,并且相对于                         openSession()来说不需要调用session.close(),而后者则必须,否则可能出现连接池对象溢出的情况(Connection对                         象不一致)

              5.Session中的get()与load()方法的区别

                         可根据id使用其方法获取单个对象,使用中形如:

Student studnet2 = (Student) session.load(Student.class, id);

                          区别:

                                   get方法立即发出发出SQL语句执行,并返回pojo对象,若未查询到结果则返回null

                                   load方法只保存代理对象的id,知道该对象的非主属性被使用时发出SQL语句执行返回一个代理对象,若未查询到结果则抛出ObjectNotFountException

3.Transaction简介

      在JDBC中是自动提交事务的,但是Hibernate中Session操作之前需要开启事务:

this.transaction = session.beginTransaction();

       结束session操作后需提交该事务

         this.transaction.commit();
         若不这样做的话,Session所做的操作将无法真正保存到数据库中

4.hbm.xml文件常见配置介绍

         有网友在这一方面分享得很全面,值得学习:http://blog.csdn.net/wangchangshuai0010/article/details/8836963



0 0