Hibernate概要

一、Hibernate框架简介:

    Hibernate是一种轻量级的ORM(Object Relation Mapping)关系对象映射框架,是SSH中的H部分,是在持久层中,用面向对象的思想解决数据访问的封装。

                                                       

二、Hibernate核心接口:

                                                       

    通过这个图,可以明白,Hibernate是通过Session、 Transaction、Query、SessionFactory、Configuration、UserType、Interceptor这几部分来完成对数据对象的一系列操作,包括对数据库表的映射,实体对象数据的操作等。

    重点是Session,这里的Session不是Http协议中的session,在网络协议中的session是基于会话的,而这里的session是数据库的一个映像,两者相差甚远。

    Session对象有三种状态:Transient、Persistent、Detached,分别表示临时、永久、分离的意思,状态之间的转化如下图:

                                                                                                                    

    Transient状态:使用new关键字实例化的对象,通常情况下,这个时候的对象跟数据库之间还没有任何关联行为,如果没有该对象的引用会被垃圾回收掉。

    Persistent状态:持久实例,具有数据库标示。它的数据,由持久化管理器Session统一管理。Session由SessionFactory管理,Session对数据的管理都在事务内进行,甚至包括查询,但如果仅仅只有查询的话,可以在Session的事务开启前设置它的FlushMode模式来节省开销。

    Persistent状态的数据默认在事务提交的时候,执行sql语句,进行数据与数据库的Insert、Update、Delete操作。一个框架一定是足够灵活的,Hibernate提供了lazy标签来决定数据的提交时刻,而这个lazy可以加载到某一个类上,也可以是针对某个集合的,这样大大提高了对数据操作的灵活程度,也正是通过这个机制,可以对程序进行一些优化,如,避免延迟加载,可以大大减少与数据库交互的次数等。另外,尽管Hibernate引入了缓存的机制,但总体上还是影响性能的,因此,一些对性能要求极强的系统,往往不会选择使用它。另外,引入了缓存占用的内存就比较大,而且除了保存对象的一级和二级缓存之外,Hibernate还提供了保存普通属性的查询缓存。如果处理不好,会导致内存溢出。因此,在对大数据量进行操作的时候,往往会禁用二级缓存,同时对数据进行批量操作,批量清除一级缓存等策略进行优化,而这种策略在诸如Oracle等数据库中也是广泛采用的,比如,在Oracle中同样也可以设置批量插入的数据,Hibernate也提供了对这些允许用户自定义批量操作的支持。

    Deteached状态:从Session写到数据库中去的数据。意思是这些数据脱离了Hibernate的管理。

    三种状态的数据之间是相互联系的,他们之间可以相互转化。如:一个User对象在一个Session事物中将数据提交到数据库后关闭Session,之后在另一个Session事物中,通过Update方法可以将User的Deteached状态重新转变为Persistent状态。

    值得注意的是:如果使用的是UUID的方式生成主键,那么在调用Session的save方法之前,是没有sql语句交互的;如果是使用native策略,那么主键的生成是要跟数据库打交道的,另外在映射文件中的数据类型也不一样。


    Transaction:关于事务,Hibernate默认是不自动提交,这根jdbc是不一样的。而且,Session的管理往往都是和事务密不可分的。

    Query:Hibernate除了支持原生的sql语句查询,还有一些特定的hql查询策略,操作起来更加简单,比如查询语法的简化,导航查询要比使用sql的链接查询语法更容易。但是,正是因为封装彻底的原因,单纯使用hql查询语句不容易实现复杂的功能,可谓是利弊共存。   

    UserType数据类型转换,适应不同类型的数据库,如charsqlvarchr2(oracle)等,类似Struts,用户可以自定义类型的转化。

    Intercepter:保存前后变化,应该避免使用persist class,因为会有侵入,而intercepter不会。一般用不到这里的功能。


四、Hibernate的重点部分概要:

    Hibernate是在数据持久层的一个封装,主要包含有:通过XXXX.hbm.xmlhibernate.cfg.xml映射文件来解决实体对象与数据表字段之间的映射,如、一对多,单双向等; 通过Session统一控制数据交互;Hql查询语句对普通属性、实体对象以及关联对象、是否延迟加载等的控制;在xml中定义一些标签,决定对象属性、之间的抓取策略;将缓存的控制放到xml中,进行灵活可配,当然程序中也需要一些相关的辅助;对锁的操作也更加简化了,如,乐观锁只需在实体类和映射文件中添加version字段即可。

    总结成几个部分:

映射(一对一(主外键、同一主键)、一对多、多对一、多对多,单向和双向)、session操作数据(使用hql还是get、load方法,普通属性、实体对象,是否延迟和使用缓存)、锁控、缓存控制。

    关于映射:

    都需要指明关联的字段,只是对应的策略不同。多对多是通过第三张表,一对多和多对一是通过外键关联字段,一对一的主外键关联是一对多或者多对一的一个特例(限制不为空),一对一同一主键指明主键字段同时还是一个外键。

五、Hibernate的优略:

    优点:

    个人感觉使用Hibernate最大的变化就是对数据的操作对象化。我们只需要集中精力关注对象模型,而不必花太多的时间,去创建数据库。

    因为对数据操作更加简洁,某种程度上提高了,开发效率。

    Hibernate是一个轻量级的POJO框架,POJO的优点就是类之间的耦合非常的低,没有继承关系,这样可以允许类之间的随意组合和复用,同样也没有侵入性。

    缺点:

    对性能的影响。正如上面已经提到的,在业务数据处理和数据库之间添加了更多的操作,另外,又大量使用缓存会影响性能。

    不适用于大量查询统计的业务中。

    正是因为对数据库操作的封装比较彻底,导致针对数据库特性的语句,调优比较困难。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值