Hibernate知识点概述

来源:互联网 发布:程序源码交易 编辑:程序博客网 时间:2024/06/05 22:53

2.Hibernate

概念理解:Hibernate是一种轻量级对jdbc的封装(dao持久层).Hibernate来完成对jdbc操作.在dao层进行使用.与数据库进行的交互操作
    类与表对应,属性与表的字段对应.对象与表中的记录对应
优点:
  1.  Hibernate对jdbc访问数据库的代码做了大量的封装.大大简化了数据访问层繁琐的重复性代码
  2. Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,很大程度的简化了dao层编码工作
  3. Hibernate的性能非常好.是一个轻量级的框架,映射的灵活性出色.支持各种数据库,从一对一到一对多的各种复杂关系.ORM对象关系映射(Object relation Mapping,简称ORM)就是使用ORM可以将对象与表进行映射,使我们可以去操作对象就完成了对表格的操作
Hibernate中PO类的编写规则:
  1. 必须提供一个无参数的public构造方法(反射使用)
  2. 所有属性要私有化,对外提供public的get/set方法
  3. 在PO类必须提供一个标识属性.让他与数据库中的主键对应,我们称这个属性叫OID
  4. PO类中的属性尽量使用基本数据类型的包装类(基本数据类型的默认值是0,0.00,false,'\u0000'等,包装类的默认值是null)
  5. PO类不能用final修饰符

为什么使用OID.(OID作用)
  • OID指的是与数据库中表的主键对应的属性
  • Hibernate框架是通过OID来区分不同的PO对象,如果在内存中有两个相同的OID对象,hibernate会认为是同一个对象
PO类使用包装类型
使用基本数据类型是没有办法去描述不存在的概念,如果使用包装类,就是一个对象,对于对象的默认值是null
PO类不能用final修饰(可以和Hibernate中的get/load方法的区别)
如果没有匹配的数据库记录,load()方法可能抛出无法回复的异常(unrecoverable exception).如果不确定数据库是否有匹配的行存在,应该使用get()方法,查询立即执行,返回实体类类对象,如果没有对应的行,会返回一个null
session.get()方法,查询立即执行.返回实体类对象
session.load().方法,默认采用延迟加载数据方式,不会立即查询,返回该实体类的子类对象(动态生成代理类对象)
注:如果PO类使用final修饰,load无法创建代理对象,返回目标对象本身(load效果和get效果等同)


Hibernate持久化三种对象的状态(Transient,persistent,Detached)
  1. 无oid,瞬时态.(Transient).临时态,自由态,一般是new出来的对象,不存在OID,与Hibernate session无关联,在数据库中无记录,使用完成后.会被jvmz直接回收掉.只是用于信息携带.
  2. 有OID.与session有关.具有持久化表示OID的特性,在事务未提交之前一致是持久态.当他发生改变的时候.Hibernate是 可以检测到的.
  3. 有oid.与session无关.指持久态对象失去了与session的关联.存在OID.在数据中有可能存在.也有可能不存在
执行流程
  • 通过Configutation.configure()读取并解析hibernate.cfg.xml配置文件.
  • 由hibernate.cfg.xml中的<mapping resource="com./xx/User/hbm.xml"/>读取并解析映射信息
  • 通过config.buildSessionFactory()创建SessionFactory
  • seessionFactory.openSession()打开session
  • session.beginTransaction()创建事务
  • persistent operate(持久化操作)
  • session.getTransaction().commit();
  • 关闭session
  • 关闭SessionFactory  


cascade与inverse的区别:
cascade级联  是完成级联操作的   是对象的一种操作.级联去操作有关联联系的另一方
inverse 只有在双向关联情况下有作用,是指定由哪一方维护外键.  true的一方放弃外键维护,由多的一方进行外键的维护

Hibernate缓存和延迟加载
Hibernate一级缓存又称为Session的缓存.session内置不能被卸载.session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务).一级缓存中,持久化类的每个实例都具有唯一的OID
Hibernate二级缓存又称为SessionFactory的缓存.由于SessionFactory对象的生命周期和应用程序的整个过程对应.因此Hibernate二级缓存是进程范围或者是集群范围的缓存.有可能出现并发问题.因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别.第二级缓存是可选的.是一个可配置的插件.默认下SessionFactory不会启用这个插件
Session的延迟加载实现要解决两个问题:正常关闭连接.确保两个请求中访问的是同一个Session.HibernateSession就是一个java.sql.Connection的一层高级封装.一个session对应一个Connection.http请求结束后正确的关闭session(过滤器实现session的正常关闭),延迟加载必须保证是同一个session(session绑定在ThreadLocal)
Hibernate的缓存机制:
A:hibernate一级缓存
  • hibernate支持两个级别的缓存,默认只支持一级缓存.
  • 每个session内部自带一个一级缓存
  • 某个Session被关闭后,其对应的一级缓存自动清除
B:hibernate 二级缓存
  • 二级缓存独立于session,默认不开启.

什么是延迟加载
延迟加载机制是为了避免一些无谓的性能开销而提出来的.所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作.在Hibernate中提了对实体象的延迟加载以及集合的延迟加载.另外在Hibernate3中提供了对属性的延迟加载.


Hibernate域Mybatis的区别
  1. Mybatis是把sql语句与java代码分离了,sql语句在xml文件中配置
  2. Hibernate是ORM框架,(对象关系映射)他对JDBC进行了封装.在分层结构中处于持久化层.他能建立在面向对象的域模型和关系数据模型之间的映射,大大简化了dao层的编码工作
  3. Mybatis是半自动的,Hibernate是全自动的,就是说Mybatis可以配置sql语句.对于sql调优来说是比较好的.Hibernate会自动生成所有的sql语句,调优不方便.Hibernate用起来难度要大于Mybatis.


原创粉丝点击