zoukankan      html  css  js  c++  java
  • hibernate概述

    转自:http://www.cnblogs.com/eflylab/archive/2007/01/09/615338.html

    Hibernate的核心组件
    在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层。它通过配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(***.hbm.xml)把JAVA对象或PO(Persistent Object,持久化对象)映射到数据库中的数据库,然后通过操作PO,对数据表中的数据进行增,删,改,查等操作。
    除配置文件,映射文件和持久化类外,Hibernate的核心组件包括以下几部分:
    a)Configuration类:用来读取Hibernate配置文件,并生成SessionFactory对象。
    b)SessionFactory接口:产生Session实例工厂。
    c)Session接口:用来操作PO。它有get(),load(),save(),update()和delete()等方法用来对PO进行加载,保存,更新及删除等操作。它是Hibernate的核心接口。
    d)Query接口:用来对PO进行查询操。它可以从Session的createQuery()方法生成。
    e)Transaction接口:用来管理Hibernate事务,它主要方法有commit()和rollback(),可以从Session的beginTrancation()方法生成。

    Persistent Object
    持久化对象可以是普通的Javabeans,惟一特殊的是它们与(仅一个)Session相关联。JavaBeans在Hibernate中存在三种状态:
    1.临时状态(transient):当一个JavaBean对象在内存中孤立存在,不与数据库中的数据有任何关联关系时,那么这个JavaBeans对象就称为临时对象(Transient Object)。
    2.持久化状态(persistent):当一个JavaBean对象与一个Session相关联时,就变成持久化对象(Persistent Object)
    3.脱管状态(detached):在这个Session被关闭的同时,这个对象也会脱离持久化状态,就变成脱管状态(Detached Object),可以被应用程序的任何层自由使用,例如可以做与表示层打交道的数据舆对象(Data Transfer Object)。

    Hibernate的运行过程
    Hibernate的运行过程如下:
    A:应用程序先调用Configration类,该类读取Hibernate的配置文件及映射文件中的信息,并用这些信息生成一个SessionFactpry对象。
    B:然后从SessionFactory对象生成一个Session对象,并用Session对象生成Transaction对象;可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载,保存,更新,删除等操作;在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将 提交这些操作结果到数据库中。

    Hibernate的运行过程如下图:

    转自:http://www.cnblogs.com/javaNewegg/archive/2011/08/28/2156521.html

    原理:
    1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件
    2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息
    3.通过config.buildSessionFactory();//创建SessionFactory
    4.sessionFactory.openSession();//打开Sesssion
    5.session.beginTransaction();//创建事务Transation
    6.persistent operate持久化操作
    7.session.getTransaction().commit();//提交事务
    8.关闭Session
    9.关闭SesstionFactory

    为什么要用:
    1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

    2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作

    3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

    4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
     
    2. Hibernate是如何延迟加载?
    1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)

    2. Hibernate3 提供了属性的延迟加载功能

    当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。

    3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)

    类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、

    4. 说下Hibernate的缓存机制

    1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存

    2. 二级缓存:
    a) 应用及缓存
    b) 分布式缓存
    条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据
    c) 第三方缓存的实现
    ////////一级缓存:session级的缓存也叫事务级的缓存,只缓存实体,生命周期和session一致。不能对其进行管理。

    不用显示的调用。

    二级缓存:sessionFactory缓存,也叫进程级的缓存,使用第3方插件实现的,也值缓存实体,生命周期和sessionFactory一致,可以进行管理。

    首先配置第3放插件,我们用的是EHCache,在hibernate.cfg.xml文件中加入

    <property name="hibernate.cache.user_second_level_cache">true</property>

    在映射中也要显示的调用,<cache usage="read-only"/>

    二级缓存之查询缓存:对普通属性进行缓存。如果关联的表发生了修改,那么查询缓存的生命周期也结束了。

    在程序中必须手动启用查询缓存:query.setCacheable(true);/////////

    5. Hibernate的查询方式
    Sql、Criteria,object comptosition
    Hql:
    1、 属性查询
    2、 参数查询、命名参数查询
    3、 关联查询
    4、 分页查询
    5、 统计函数

    6. 如何优化Hibernate?
    1.使用双向一对多关联,不使用单向一对多
    2.灵活使用单向一对多关联
    3.不用一对一,用多对一取代
    4.配置对象缓存,不使用集合缓存
    5.一对多集合使用Bag,多对多集合使用Set
    6. 继承类使用显式多态
    7. 表字段要少,表关联不要怕多,有二级缓存撑腰


    1.Hibernate有哪几种查询数据的方式

             (1)导航对象图查询

          (2)OID查询

          (3)HQL

          (4)QBC

          (5)本地SQL

    2.load()和get()的区别

    load加载方法:

    Java代码

    Users user = (Users)session.load(Users.class, userId);    

    Users user = (Users)session.load(Users.class, userId);

    get加载方法:

    Java代码

    Users user = (Users)session.get(Users.class, userId);  

    Users user = (Users)session.get(Users.class, userId);

    两加载方法区别:

    区别1:如果数据库中,没有userId的对象。如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException;

    区别2:load支持延迟加载,get不支持延迟加载。

    也就是说:

    Java代码

    Users user = (Users)session.load(Users.class, userId);  

    Users user = (Users)session.load(Users.class, userId);

    这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。

    而:

    Java代码

    Users user = (Users)session.get(Users.class, userId);  

    Users user = (Users)session.get(Users.class, userId);

    则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, userId);不会执行任何sql。

    注意:

    Java代码

    Users user = (Users)session.load(Users.class, userId);   
    System.out.println(user.getId());  

    Users user = (Users)session.load(Users.class, userId);

    System.out.println(user.getId());

    上面这2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。

  • 相关阅读:
    jQuery 基本选择器
    JavaScriptif while for switch流程控制 JS函数 内置对象
    JavaScrip基本语法
    数据库 存储引擎 表的操作 数值类型 时间类型 字符串类型 枚举集合 约束
    数据库基础知识 管理员 用户登录授权的操作
    粘包的产生原理 以及如何解决粘包问题
    socket TCP DPT 网络编程
    2018年年终总结
    Android技术分享
    No accelerator found
  • 原文地址:https://www.cnblogs.com/kxm87/p/6168660.html
Copyright © 2011-2022 走看看