疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Hibernate学习笔记之体系结构的理解


 

   

  Hibernate是什么?个人理解是能让对象与数据库表一一映射的中间层(ORM体系),模块层,它能省去一些增删查改等简单sql语句,省去使用JDBC时sql语句的拼接和查询结果

  集后对object的属性的setter调用.

  ORM:对象角色建模。用来自动映射数据,是对JDBC进行对象轻型封装。

  Hibernate与JDBC

  JDBC与Hibenate性能比较:

  1、简单的对象操作的增删改查,那么hibernate就比较的方便,因为hibernate

  封装了这些简单的操作,只要调用相应的find,save等方法而不用操作SQL 2、复杂的SQL操作使用jdbc方便。

  3、jdbc效率比hibernate要高,尤其在大规模的数据多表的联合查询等方面 4、取百家之所长;hibernate可以和jdbc结合着使用。

  JDBC的缺点:

  1、所有的SQL 都要手编,任务繁重

  2、当从数据库取得数据存到Bean对象时,需要手动set 3、过多的try..catch处理

  4、过多考虑Connection等是否关闭

  Hibernate优点:

  1、用户不用操作SQL语句

  2、 获取数据Bean方便,每个表对应映射一个Bean类,取得数据时只需转换成 对应Bean类型即可,如User user = (User)session.get(User.class, id)

  存储数据时会根据映射文件自动将对象中各属性转换并存到表格中相应字

  段。

  3、不用try..catch处理,不用考虑Connection等是否关闭,只需将Session关闭,

  关闭Session只是将Connection归还到连接池,并没有关闭Connection。

  Hibernate基本接口

  Configuration接口:

  此对象用于配置并启动Hibernate,实例一个此对象来指定对象—关系映射文件路径,然后创建一个SessionFactory实例

  SessionFactory接口:

  一个实例对应一个数据存储源,应用从SessionFactory中获得Session实例。SessionFactory是重量级的,所以不能随意创建和销毁它的实例。访问一个数据库只创建一个SessionFactory实例,访问多个数据库就要创建多个SessionFactory实例。确保SessionFactory与每一个数据库一对一关系。

  Session接口:

  提供持久化相关的操作。如添加、删除、加载、查询等。它是轻量级的, 所以不需消耗太多资源。可以经常创建或销毁一个Session实例。

  Query接口:

  Hibernate查询的接口,用于向数据库查询对象,执行查询操作。

  Criteria接口: 执行动态查询

  Transaction接口:

  是Hibernate的数据库事务接口,对底层的事务接口(JDBC、JTA)作了封装,在Hibernate应用中不直接访问底层事务接口。而且通过Transaction来访问。JTA是 Java Transaction API

  Hibernate缓存

  session缓存产生:

  一个Java对象被创建将被分配一定堆内存空间,如果这个对象没有被任何变量引用则结束生命周期,内存将回收。因此希望这个对象一直处于生命周期则必须保证至少有一个变量引用它,或某个JAVA集合中存放了这个对象的引用。Hibernate中,在Session接口的实现类SessionImpl中定义了一系列的Java集合,这些集合构成了Session的缓存。SessionImpl中通过Map处理put一些Java集合。

  比如当用户信息提交(User类),调用Session的save(User)方法时,此时并没有真正插入到数据库(事务还没提交),User对象被加到Session的缓存。User对象仍处于生命周期。当调用Session 的load()方法时,Session先判断缓存中是否还有这个对象,如果存在,则不再查找数据库。可见Session缓存可以减少数据库的操作次数,从而提高系统性能。

  session缓存清除:

  1、当事务进行commit后,hibernate将调用flush先清理缓存,再执行save(User)对应的insert语句。

  2、手动调用flush时,比如find找到一条记录后同时会存一份到缓存,下次再找这条记录时会先从缓存中找到而不去查找数据库,此时用flush可以清除缓存的记录而强迫去查找数据库。

  3、调用Session的close()方法时,Session的缓存全部清空,User对象生命结束, 比如save(User)后再调用close,将清除缓存,再load时缓存中找不到,数据库中也找不到。因为并没有提交事务

  hibernate提供二个级别的缓存。第一级缓存是Session缓存,第二级缓存是一个可插拔的缓存插件。

  一级缓存

  当应用程序调用Session的save(), update(), saveUpdate(), load(), get(), find()以及查询接口的list(), iterate(), filter()方法时,若在一级缓存中还存在相应的对象,hibernate会把此对象加入到一级缓存。Session另外提供两个清理缓存的方法:

  evict(Object 0)用于从缓存中清除参数指定的持久化对象 clear()用于清空缓存中所有持久化对象

  可插拔二级缓存

  二级缓存由SessionFactory负责管理。由于SessionFactory在hibernate启用时产生,整个生命周期和应用程序进程对应。因此二级缓存是进程范围或群集范围的缓存

  比如当用户信息提交(User类),调用Session的save(User)方法时,此时并没有真正插入到数据库(事务还没提交),User对象被加到Session的缓存。User对象仍处于生命周期。当调用Session 的load()方法时,Session先判断缓存中是否还有这个对象,如果存在,则不再查找数据库。可见Session缓存可以减少数据库的操作次数,从而提高系统性能。

  session缓存清除:

  1、当事务进行commit后,hibernate将调用flush先清理缓存,再执行save(User)对应的insert语句。

  2、手动调用flush时,比如find找到一条记录后同时会存一份到缓存,下次再找这条记录时会先从缓存中找到而不去查找数据库,此时用flush可以清除缓存的记录而强迫去查找数据库。

  3、调用Session的close()方法时,Session的缓存全部清空,User对象生命结束, 比如save(User)后再调用close,将清除缓存,再load时缓存中找不到,数据库中也找不到。因为并没有提交事务

  hibernate提供二个级别的缓存。第一级缓存是Session缓存,第二级缓存是一个可插拔的缓存插件。

  一级缓存

  当应用程序调用Session的save(), update(), saveUpdate(), load(), get(), find()以及查询接口的list(), iterate(), filter()方法时,若在一级缓存中还存在相应的对象,hibernate会把此对象加入到一级缓存。Session另外提供两个清理缓存的方法:

  evict(Object 0)用于从缓存中清除参数指定的持久化对象 clear()用于清空缓存中所有持久化对象

  可插拔二级缓存

  二级缓存由SessionFactory负责管理。由于SessionFactory在hibernate启用时产生,整个生命周期和应用程序进程对应。因此二级缓存是进程范围或群集范围的缓存

  Hibernate事务

  Hibernate可以配置为JDBCTransaction或者是JTATransaction,这取决于你在hibernate.properties中的配置:

  如果你什么都不配置,默认情况下使用JDBCTransaction,如果你配置为:

  hibernate.transaction.factory_class

  net.sf.hibernate.transaction.JTATransactionFactory

  将使用JTATransaction

  JTA事务与JDBC事务区别:

  1、JTA提供了跨Session的事务管理能力,这是与JDBCTransaction最大的差异。 JDBC 事务由Connection管理,事务周期限于Connection的生命周期之内。

  2、JTA事务管理由JTA容器实现,JTA容器对当前加入事务的众多Connection进行调度,JTA事务横跨多个Session。需要注意的是,参与JTA事务的 Connection需避免对事务管理进行干涉,如果采用JTA Transaction,就不应该再调用Hibernate的Transaction功能。

  JTA事务

  Java Transaction API(Java事务API)。JTA Transaction是指由J2EE Transaction manager去管理的事务。其最大的特点是调用UserTransaction接口的begin,commit和rollback方法来完成事务范围的界定,事务的提交和回滚。JTA Transaction可以实现同一事务对应不同的数据库,但它仍无法实现事务的嵌套

  JDBC事务

  Hibernate的JDBCTransaction根本就是conn.commit而已,只不过在Hibernate中,Session打开的时候,就会自动conn.setAutoCommit(false),不像一般的JDBC,默认都是true,所以JDBC不写commit也没有关系,由于Hibernate已经把AutoCommit给关掉了,所以用Hibernate的时候,你在程序中不写Transaction的话,数据库根本就没有反应

  Hibernate对于JDBC事务的操作非常简单,如下:

  session=sessionFactory.openSession();

  Transaction tx= session.beginTransaction();

  session.save();

  tx.commit();

  session.close();

  JDBC与JTA事务对比

  1、Hibernate Transaction是从Session中获得的,tx = session.beginTransaction(),最后要先提交tx,然后再session.close,这完全符合JDBC的Transaction的操作顺序

  2、JTA的Transactioin操作顺序相反。 JTA是先启动Transaction,然后启动Session,关闭Session,最后提交Transaction