在Hibernate框架简述
中,演示了一个简单的Hibernate应用,但并没有深入说明其中程序,在这篇中将比较详细的介绍一下Hibernate的核心组件。
首先最关键一点就是Hibernate的配置文件,如果仔细看过我前面的笔记构建一个简单的基于MVC模式的JavaWeb
,我们可以大概知道hibernate的配置文件就相当于构建一个简单的基于MVC模式的JavaWeb
一文中的db.properties文件,当时我们在db.properties文件中设置了连接数据库的参数,因此Hibernate的配置文件作用也是如此,但它还有一个作用是要定义程序中我们用到的映射文件(***.hbm.xml)。
例:




























另外它的持久化类其实就是一个普通的JavaBean,只不过一个持久化类对应 一个数据表。另外定义的时候 要遵循一定的规则!
映射文件是把一个持久化类与一张表映射起来。
例:





























说明:
class元素
:
用来定义一个持久化类,它的属性name和table分别为持久化的类名及对应到DB中的表名。
id元素
:
是class的子元素。被映射的类必须声明对应数据表主键字段。大多数据有一个JavaBean 风格的属性,为一个实例包含惟一的标识。id元素定义了该属性到数据表主键字段的映射。它有name,type和column三个属性和一个generator子元素
:
generator
元素 用来指定id标识的生成类的名字。它有一个属性class,用来指定一个Java类名。 该类用来为持久化类的实例生成惟一的标识。所以也叫生成器
(generator)。如 果这个生成器实例需要某些配置值或者初始化参数,可用<param>元素来传递。
所有生成器都实现org.hibernate.id.IdentifierGenerator接口。
Hibernate提供了很多内置的生成器。下面是Hibernate内置生成器的快捷名字:
1:increment(递增)。
其为org.hibernate.id.IncrementGenerator类快 捷名字,用于为long,short或者int类型生成惟一标记。只有在没有其他进程往 同一张表中插入数据时才能使用。在集群下不要使用。
2:identity(标识)。
其为org.hibernate.id.IdentityGenerator类快捷 名字,对DB2,MySQL,SQL Server和Sybase等数据库的内置标识字段提供支持。 返回的标识符是long,short或者int类型的。
3:sequence(序列)。
其为org.hibernate.id.SequenceGenerator类的快 捷名字,为DB2,Oracle和SAP DB等数据闸的内置序列提供支持。返回类型是long, short或者int类型的。
4:seqhilo(序列高/低位)。
org.hibernate.id.SequenceHiLoGenerator 类的快捷名字,使用一个高/低位算法来高效地生成long,short或者int类型的标识符, 需要指定一个数据库sequence的名字。
5:uuid.hex。
其
为org.hibernate.id.UUIDHexGenerator类的快捷名字,使用 一个128位的UUID算法生成字符串类型的标识符,在一个
网络中是惟一的(使用了IP地 址)。UUID被编码为一个32位16进制的字符串,包含IP地址,JVM的启动时间(精确到 14s),系统时间和一个
计算器值(在JVM中是惟一的)。
6:assigned。
其为org.hibernate.id.Assigned类的快捷名字,可让应用程序在
执行save()方法之前为对象分配一个标识符。如果需要 为应用程序分配一个标识符(而 非由Hibernate来生成它们),可以用assigned生成器。
7:foreign。
其为org.hibernate.id.ForeignGenerator类的快捷名字。它使用了另外一个相关的对象标识符,和<one-to-one>元素一起使用。
property元素:
是class元素的一个子元素。它为类声明一个持久化的,JavaBean网络的属性。它有 name,colum,type和length等属性。
Configuration类
:
它负责管理Hiberante的配置信息,它主要用来加载这些配置文件。如上术的hibernate.cfg.xml文件!
例:







SessionFactory接口
:
SessionFactory负责Session实例的创建。可以通过Configuration实例创建
例:



Congifuration对象会根据当前的配置信息,生成SessionFactory对象。SessionFactory对象一旦构造完毕,
即被赋予特定的配置信息,即以后配置改变不会影响到创建的SessionFactory对象。如果要把屐后的配置信息赋给SessionFactory对
象,需要从新的Configuration对象生成拳的SessionFactory对象。
SessionFactory是纯种安全的,可以被多线程调用以取得Session,而且构造SessionFactory很消耗资源,所以多数 情况下一个应用中只初始化一个SessionFactory,为不同的线程提供Session。
当客户端发送一个请求线程时,SessionFactory生成一个Session对象来处理客户请求,如下:


















Session接口
:
Session是应用程序与数据库之间的一个会话,是Hibernate运作的中心,持久层操作的基础,相当于JDBC中的Connection。Session对象是通过SessionFactory创建的:
Session session = SessionFactory.openSession();
一
个持久化类与普通的JavaBean没有任何区别,但是它与Session关联后,就具有了持久化能力。当然,这种持久化操作是受Session控制的,
即通过Session对象的装载,保存,创建或查询持久化对象。Session类的save(),delete()和load()等方法,来分别完成对持
久化对象的保存,删除,修改加载等操作!Session类方法的用途可以分以下五类:
1:取得持久化对象:get()和load()等方法。
2:持久化对象的保存,更新和删除:save(),update()saveOrUpdate()和delete()等方法。
3:createQuery()方法:用来从Session生成的Query对象。
4:beginTransaction()方法:从Session对象生成一个Transaction对象。
5:
管理Session的方法:isOpen(),flush(),clear(),evict()和close()等方法,其中isOpen()方法用来检
查Session是否仍然打开;flush()用来清理Session缓存,并把缓存中的SQL语句发送出去,clear()用来清除Session中的
所有缓存对象evict()方法来清楚Session缓存中的某个对象;close()关闭Session。
取得持久化对象的方法
:
取得持久化对象的方法主要有get()和load(),它们通过主键id来取得PO。
get()方法示例

















load()方法示例
:
























持久化对象的保存,更新和删除方法
save()方法
:
session的save()方法将 一个PO的属性取出放入PreparedStatement语句中,然后向数据库中插入一条记录(或多条记录,如果有级联)。
session保存一个对象时,按如下步骤进行:
1:根本配置文件为主键id设置的生成算法 ,为PO指定 一个ID。
2:将 PO对象纳入session内部缓存(一个Map)内。
3:事务提交时,清理缓存,将 新对象通过insert语句持久化到数据库中。
如果要为新的PO强制指定一个ID,可以调用Session的重载方法save(Object obj,Serializable id)
例:
session.save(tRegister, new Integer(123));
在调用save()方法时,并不立即执行SQL语句,而是等到清理完毕缓存时才执行。如果在调用save()方法后又修改了PO的属性,则Hibernate将 会发送一条insert语句和一条update语句来完成持久化操作,如下:

















监视上述程序运行会产生二条SQL:
Hibernate: select max(id) from t_register
Hibernate: insert into t_register (userName, userPwd, sex, age, id) values (?, ?, ?, ?, ?)
Hibernate: update t_register set userName=?, userPwd=?, sex=?, age=? where id=?
因此,最好是在对象状态稳定时再调用 save()方法,可以少执行一条update语句。
调用save()方法将临时对象保存到数据库中,对象的临时状态将 变为持久化状态。当对象在持久化状态时,它一直位于Session缓存中,对它的任何操作在事物提交时都将同步保存到数据库中
,因此,对一个已经持久化的对象调用save()或update()方法是没有意义的
,如下:



















程序运行效果还是和上面的一样!
update()方法
:
Session的update()方法是用来更新脱管对象的。它的用法如下:











调用update()方法时,并不是立即发送SQL语句,对对象的更新操作将积累起来,在事物提交时由flush()清理缓存,然后发送一条SQL语句完成全部的更新操作!
saveOrUpdate()方法
:
在实际应用中WEB程序员自言自语不会注意一个对象是脱管对象还是临时对象,而对脱管对象使用save()方法是不对的,对临时对象使用update()方法也是不对的。为了解决这个问题,便产生saveOrUpdate()方法。
saveOrUpdate()方法首先会判断该PO是脱管对象还是临时对象,然后会调用合适的方法。
那么saveOrUpdate()方法如何判断PO是临时对象还是 脱管对象呢?当满足下载情况之一时,Hibernate就认定它是临时对象。
1:在映射表中为<id>设元素设置了unsaved-valu属性,并且实体对象的ID取值和unsaved-value匹配(默认为null)(注意:int和long型的ID的unsaved-value默认值为0)。
2:在映射文件中为<version>元素设置了unsaved-value属性,并且实体对象的version取值和unsaved-value匹配(默认为null)。
delete()方法
:
session类的delete()方法负责删除一个对象(包括持久对象和脱管对象),以下为删除一个持久对象的示例!











监视运行:
Hibernate: select tregister0_.id as id0_0_,
tregister0_.userName as userName0_0_, tregister0_.userPwd as
userPwd0_0_, tregister0_.sex as sex0_0_, tregister0_.age as age0_0_ from
t_register tregister0_ where tregister0_.id=?
Hibernate: delete from t_register where id=?



发表评论
-
Hibernate 表关系描述之ManyToMany
2011-06-03 21:24 817上篇写了一对一,那么在这篇我们讲一对多,那么在表中的一对 ... -
Hibernate 表关系描述之OneToMany
2011-06-03 21:23 799上篇写了一对一,那么在这篇我们讲一对多,那么在表中的一对多,是 ... -
Hibernate 表关系描述之OneToOne
2011-06-03 21:21 1022在数据库领域中,数据表和数据表之间关系一般可以分为如下几种: ... -
Hibernate数据查询
2011-06-03 21:20 735Hibernate Query Language(HQL) C ...
相关推荐
"Hibernate框架核心jar包"是进行Hibernate开发的基础,包含了实现ORM功能的核心类和接口。这个压缩包中的"hibernate-core"文件包含了Hibernate框架的核心组件,是进行web后端开发所必需的。 在Java web应用中,...
**Hibernate框架概述** Hibernate是一个开放源代码的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。在传统的Java编程中,我们需要手动编写SQL语句来操作数据库,而Hibernate通过提供一种...
在进行Hibernate开发时,需要依赖一系列的JAR文件,这些文件包含了Hibernate框架的核心组件和其他必要的库。下面将详细介绍这些JAR文件的作用以及它们在Hibernate框架中的重要性。 1. hibernate3.jar:这是...
在给定的压缩包文件中,"lib"目录包含了Hibernate 5.2的核心组件和其他必要的依赖库。"required"子目录下的文件是运行Hibernate应用的基础,这些文件通常包括以下几类: 1. **Hibernate核心库**:`hibernate-core....
Hibernate框架技术是Java开发中的一个核心组件,它是一个对象关系映射(ORM)工具,用于在Java应用程序中处理数据库交互。本课件旨在全面讲解Hibernate框架的原理、配置与使用方法,帮助学习者轻松掌握这一强大的...
Hibernate的核心jar包包括`hibernate-core.jar`,这是Hibernate的核心组件,提供了基本的ORM功能,如实体管理、事务处理、查询语言等。在我们的例子中,`habernate.jar`很可能就是这个核心包。 2. **数据库驱动** ...
Spring、Struts 和 Hibernate 是Java开发中非常著名的三个开源框架,它们构成了经典的“SSH”企业级应用开发架构。这三个框架的结合使用,极大地提高了开发效率,简化了企业级应用程序的复杂性。 Spring 框架是Java...
总的来说,"spring+hibernate框架搭建demo"涉及到的核心知识点包括:Spring 框架的依赖注入、AOP、MVC 以及与 Hibernate 的集成;Hibernate 的对象关系映射、Session 机制和事务管理;以及 Java Web 应用的 MVC 设计...
在IT领域,尤其是在Java开发中,Hibernate框架是一个至关重要的组件,它简化了对象关系映射(ORM)的过程,使得开发者可以更加专注于业务逻辑而非数据库操作。本篇文章将深入探讨Hibernate框架的环境搭建过程,以及...
2. **核心组件** - `hibernate-core.jar`: 包含了Hibernate框架的主要API,包括SessionFactory、Session、Transaction、Query等核心接口和实现类。 - `hibernate-entitymanager.jar`: 提供了对JPA的支持,使得可以...
2. **Hibernate框架核心组件**: - **Configuration**: 配置对象,负责加载Hibernate的配置文件(如hibernate.cfg.xml),设置数据库连接等。 - **SessionFactory**: 创建Session的工厂,是线程安全的,应用启动时...
对于Hibernate框架,这些JAR文件包含了以下关键组件: 1. **Hibernate核心**:这是Hibernate框架的基础,包括实体管理、会话管理和查询API。主要的JAR文件可能有`hibernate-core.jar`,它提供了持久化服务,如...
这个“Hibernate框架jia包”包含了你需要在项目中使用Hibernate的所有核心库和依赖,确保你能顺利进行数据库操作。 1. **什么是Hibernate**: Hibernate是一个开源的ORM框架,它提供了一种在Java应用中持久化数据...
Spring MVC提供了一个灵活的架构,允许开发者自定义处理器映射器、视图解析器等核心组件。它通过DispatcherServlet接收HTTP请求,并根据配置将请求分发到相应的Controller。Controller通常是一个实现了.spring...
这个"hibernate框架完整包"包含了用于搭建和运行Hibernate项目所需的各种组件。 1. **Hibernate核心包**:这是Hibernate的核心组件,包含了对JDBC的封装、SQL语句的生成、对象持久化机制等。主要类如`...
**Hibernate框架** Hibernate是一个强大的对象关系映射(ORM)框架,解决了Java与关系数据库之间的数据交互问题。它提供了以下功能: 1. **对象持久化**:将Java对象与数据库表进行映射,简化数据库操作。 2. **...
这个“自己写的hibernate框架”是针对初学者设计的,目的是让学生能够更直观地理解Hibernate的工作原理和核心功能。通过自己编写类似的框架,学生可以深入学习Hibernate的核心机制,包括数据持久化、对象关系映射、...
Struts2的核心组件包括配置文件(struts.xml)、拦截器(Interceptor)和结果视图(Result)。通过Action类,Struts2可以将用户请求转发给业务层进行处理,然后将处理结果返回给视图层展示。 **Spring**: Spring是...
在这个“Hibernate 3.2核心包”中,主要包括以下几个关键组件和功能: 1. Hibernate API:这是与Hibernate交互的主要接口,如SessionFactory、Session、Query等。SessionFactory是创建Session的工厂,而Session则是...
这一框架集成了解决Web层、业务层和持久层问题的三个核心组件。 首先,Struts是一个基于Servlet和JSP技术的MVC(Model-View-Controller)框架。它的主要作用是将用户界面、业务逻辑和数据模型分离,从而提高代码的...