




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第11章 Hibernate 基础,本章将介绍Hibernate的基础知识,首先介绍的是Hibernate的体系结构和一些基本的概念。然后介绍Hibernate的配置情况,重点是介绍Hibernate的几个核心类和它们的使用方法。通过本章的学习可以基本了解Hibernate的结构,编写简单的Hibernate程序。,11.1 基本概念,本节将从Hibernate的基本概念讲起,介绍Hibernate的设计思想。即使在以后的程序中没有使用Hibernate,但它的设计思路还是很值得借鉴的,11.1.1 体系结构(Architecture),一个非常简要的Hibernate体系结构的概要图,如图1
2、1.1所示。从这个图可以看出,Hibernate使用数据库和配置信息来为应用程序提供持久化服务(以及持久的对象)。,11.1.2 持久化类(Persistent Classes),在应用程序中,用来实现业务问题实体的(如,在电子商务应用程序中的Customer和Order)类就是持久化类。不能认为所有的持久化类的实例都是持久的状态一个实例的状态也可能是临时的或脱管的。 如果这些持久化类遵循一些简单的规则,Hibernate能够工作得更好,这些规则也被称作简单传统Java对象(POJO)编程模型。但是这些规则并不是必需的。实际上,Hibernate3对于的持久化类几乎不做任何设想。可以用其他的方
3、法来表达领域模型:比如,使用Map实例的树型结构。,11.1.3 实例的状态,一个持久化类的实例可能处于三种不同状态中的某一种。这三种状态的定义则与所谓的持久化上下文(persistence context)有关。Hibernate的Session对象就是这个所谓的持久化上下文:,11.2 配置Hibernate,由于Hibernate是为了能在各种不同环境下工作而设计的,因此存在着大量的配置参数.幸运的是多数配置参数都有比较直观的默认值,并有随Hibernate一同分发的配置样例perties(位于etc/)来展示各种配置选项.所需做的仅仅是将这个样例文件复制到类路
4、径 (classpath)下并做一些自定义的修改。,11.2.1 数据库连接配置,Hibernate支持两种数据库连接方式:JDBC和JNDI方式。,11.2.2 全局属性配置,Hibernate提供很多方便的全局配置,可以通过调整这些参数,控制Hibernate的行为。,11.2.3 连接池配置,Hibernate自带的连接池算法相当不成熟。它只是为了让使用者快些上手,并不适合用于产品系统或性能测试中。出于最佳性能和稳定性考虑应该使用第三方的连接池。只需要用特定连接池的设置替换hibernate.connection.pool_size即可。这将关闭Hibernate自带的连接池。 在实际应
5、用中更多的看到使用Hibernate提供了一个缺省的第三方连接池C3P0,它位于lib目录下。如果设置了hibernate.c3p0.*相关的属性,Hibernate将使用C3P0ConnectionProvider来缓存JDBC连接。,11.2.4 使用其他配置方式,Hibernate同时支持xml格式的配置文件,以及传统的properties文件配置方式,不过这里建议采用xml型配置文件。xml配置文件提供了更易读的结构和更强的配置能力,可以直接对映射文件加以配置,而在properties文件中则无法配置,必须通过代码中的Hard Coding加载相应的映射文件。 Configuratio
6、n cfg = new Configuration(); .addResource(Item.hbm.xml); .addResource(Bid.hbm.xml);,11.3 Hibernate核心类,以下几个核心类几乎在任何实际开发中都会用到。通过这些类,不仅可以存储和获得持久对象,并且能够进行事务控制。,11.3.1 Configuration类,Configuration类的作用是对Hibernate进行配置,以及对它进行启动。Configuration可以完成以下几方面的工作。 (1)加载配置文件。在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的
7、位置,读取这些配置,然后创建一个SessionFactory对象, (2)动态添加映射文件。还可以利用Configuration类在程序中添加XML映射定义文件。 (3)也可以通过Configuration指定配置属性:,11.3.2 SessionFactory类,这里用到了一个设计模式工厂模式,用户程序从工厂类SessionFactory中取得Session的实例。SessionFactory不是轻量级的。它的设计者的意图是让它能在整个应用中共享。典型地来说,一个项目通常只需要一个SessionFactory就够了,但是当项目要操作多个数据库时,必须为每个数据库指定一个SessionFac
8、tory。 SessionFactory在Hibernate中实际起到了一个缓冲区的作用,它缓冲了Hibernate自动生成的SQL语句和一些其它的映射数据,还缓冲了一些将来有可能重复利用的数据。,11.3.3 Session类,Session类对于Hibernate 开发人员来说是一个最重要的类。Session是持久层操作的基础,相当于JDBC中的Connection。然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。这在实际项目中确实很重要,因为在客户程序中,可能会不断地创建以及销毁Session对象,如果Session的开销太大,会给系统
9、带来不良影响。,11.3.4 Query和Criteria类,Query类让方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句(HQL是Hibernate Query Lanaguage简称是Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。本书将有独立的章节介绍)。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作,如: String hql= from Person ; Query q = session.createQuery(hql); List rsList = q.list();,11.3.5 Tr
10、ansaction接口,Transaction类是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate的设计者自己写的底层事务处理代码。Transaction接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA中的UserTransaction、甚至可以是CORBA事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移值。 与Transaction相关还有一个Callback类。当一些有用的事件发生时例如持久对象的载入、存储、删除时,Callback类会通知Hibernate去接收一个通知消息。一般而言
11、,Callback类在用户程序中并不是必须的,但要在项目中创建审计日志时,可能会用到它。,11.4 通过Session完成基本操作,Hibernate对数据库的基本操作时通过session来完成的,在前面章节中讲述了session提供了几个方法Session接口是Hibernate向应用程序提供操作数据库的最主要接口,它提供了基本的保存、更新、删除和查询的方法。,11.4.1 保存数据,Session.save()方法用于实体对象的持久化保存,也就是说当执行session.save()方法时会生成对应的insert SQL语句,完成数据的保存。如下代码所示。 保存数据:FirstHiberna
12、te.java Person user=new Person(); user.setName(“zx”); /开始一个事务 Transaction tx=session.beginTransaction(); session.save(user); session.flush(); /提交 mit(); session.close(); /关闭事务 tx.close,11.4.2 加载数据,Session的load()和get()方法都能根据给定的OID从数据库中加载一个持久化对象,这两个方法的区别在于:当数据库中不存在与OID对应的记录时,load()方法抛出net.sf.ObjectNot
13、FoundException异常,而get()方法返回null. 由get()、load()或其他查询方法返回的对象都位于当前Session的缓存中,因此修改了持久化对象的属性后,当Session清理缓存时,会根据持久化对象的属性变化来同步更新数据库。,11.4.3 更新数据,session.update()方法能够将一个处于临时脱管或状态的对象,重新纳入Hibernate的内部缓存,变成持久化对象。如下面的代码: Transaction tx=session.beginTransaction(); session.update(customer); /提交 mit(); session.cl
14、ose(); tx.close,11.4.4 saveOrUpdate方法,这个方法有save()和update()方法的功能,对于传入的对象,首先会执行一遍查询语句判断该对象在数据库中是否存在,然后调用相应的方法。其实这个方法就是为了解决一个对象它的状态可能处于动态的变化当中的。运用这个方法就能不用太关心对象的状态,而关心业务逻辑了。如果传入该方法的是一个脱管对象,那么这个方法就会执行update操作,如果传入该方法的是一个临时对象,那么这个方法就会执行insert操作。这个方法幕后的工作原理如下:,11.4.5 删除数据,delete()方法用于从数据库中删除一个实体所对应的数据,如果传入
15、的对象是持久化对象,那么当清理缓存时,就会执行delete操作。如果传入的是脱管对象,那么首先会使该对象与session相关联,然后当清理缓存时,再执行delete操作。看如下代码: Session session=sessionFactory().openSession(); Transaction tx=session.beginTransaction(); Customer customer=(Customer)session.load(Customer.class,”1”); /计划执行一条delete语句 session.delete(customer); /清理缓存,执行一条delete语句 mit(); /关闭session,这时将会把customer对象从缓存中删除。 session.close();,11.4.6 缓存,Session具有一个缓存,位于缓存中的对象处于持久化状态,它和数据库中的相关记录对应,Session能够在某些时间点,按照缓存中持久化对象的属性变化来同步数据库,这一过程称为清理缓存。 (1)Session缓存的实现原理。Sessio
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度文化产业产权转让与市场推广合同
- 2025年度委托收款与新能源项目合作合同
- 2025年度乙方转丙方特许经营合同模板
- 2025年度家居装修工人安全责任免除协议书
- 2025年度电影演员档期聘用合同
- 2025年度土地承包经营权流转与农村电商合作合同
- 2025年度危重病人治疗免责协议书(特定医疗机构版)
- 2025年度文化产业发展自愿退股及项目运营合同模板
- 2025年度养老机构委托管理及运营合作协议范本
- 信访接待室改造工程合同
- 2025年海南职业技术学院高职单招语文2018-2024历年参考题库频考点含答案解析
- 北京市西城区2024-2025学年高三上学期期末考试语文试题(解析版)
- 2025年春新人教版数学一年级下册课件 第六单元 数量间的加减关系 第2课时 求比1个数多(少)几的数
- 语文课堂中的多媒体教学方法研究
- 民用无人机操控员执照(CAAC)考试复习重点题库500题(含答案)
- 2025年春新北师大版物理八年级下册课件 第六章 质量和密度 第三节 密度的测量与应用
- 北京市朝阳区2025下半年事业单位招聘149人历年高频重点提升(共500题)附带答案详解
- 肩袖损伤课件
- DB3207-T 1047-2023 羊肚菌-豆丹综合种养技术规程
- 钢筋安装施工技术交底
- 2025年下学期八年级物理备课组工作计划
评论
0/150
提交评论