JavaEE轻量级框架Struts2 spring Hibernate整合开发 第5章Hibernate的基础知识_第1页
JavaEE轻量级框架Struts2 spring Hibernate整合开发 第5章Hibernate的基础知识_第2页
JavaEE轻量级框架Struts2 spring Hibernate整合开发 第5章Hibernate的基础知识_第3页
JavaEE轻量级框架Struts2 spring Hibernate整合开发 第5章Hibernate的基础知识_第4页
JavaEE轻量级框架Struts2 spring Hibernate整合开发 第5章Hibernate的基础知识_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaEE轻量级框架Struts2+spring+Hibernate整合开发

第5章Hibernate的基础知识内容5.1ORM基本概念5.2Hibernate的体系结构5.3HibernateAPI简介5.4Hibernate的配置文件5.5Hibernate中的持久化类5.6Hibernate的对象-关系映射文件5.8在MyEclipse中使用Hibernate5.7通过HibernateAPI操纵数据库5.9Session的缓存5.1ORM基本概念

5.1.1ORM框架简介目前ORM框架有很多,但比较流行的主要有以下几种:EJB框架:EJB是原来的sun公司的服务器端组件模型,设计目标与核心应用是部署分布式应用程序。Hibernate框架:Hibernate是目前最流行的开源ORM框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。iBATIS框架:iBATIS是Apache软件基金组织的子项目。它提供的持久层框架包括SQLMaps和DataAccessObjects(DAO),同时还提供一个利用这个框架开发的JPetStore实例。TopLink框架:TopLink原署WebGain公司的产品,后被Oracle收购,并重新包装为

OracleASTopLink。5.1ORM基本概念5.1.2ORM中的映射关系ORM的主要目的是通过类和对象来操作数据库,所以在ORM中必须解决编程语言中的类与对象和数据库中的表之间的映射。不同的框架中实现的方式有所不同但基本思路是一样的。类与数据库中表的映射:对象与表中的记录的映射类的属性与数据库中表的字段的映射5.2Hibernate的体系结构Hibernate体系结构的概要图如下:ApplicationHibernateHibernate.propertiesXMLMappingDatabasePersistentObjects5.2Hibernate的体系结构过图5-1可以看出,Hibernate是连接应用程序与数据库之间的一个中间件,在应用程序中通过创建持久化类来使用Hibernate。这样应用程序不再关心后台所用的是什么数据库,实现了应用程序的业务逻辑与数据库之间的解耦。在Hibernate框架内需要两个文件,一个是Hperties,该文件用于配置Hibernate和数据库的连接信息,另一个是XML映射文件,该文件用来描述持久化类和数据库表、数据列之间的对应关系。5.2Hibernate的体系结构Hibernate具体实现类结构ApplicationTransactionFactoryConnectionProviderDatabasePersistentObjectsTransientObjectsSessionFactorySessionTransactionJNDIJDBCJTA5.2Hibernate的体系结构图5-2中各个对象的定义如下:SessionFactory(org.hibernate.SessionFactory)是针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。它是生成Session的工厂,本身要用到ConnectionProvider。该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。5.2Hibernate的体系结构Session(org.hibernate.Session)表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短。其隐藏了JDBC连接,也是Transaction的工厂。其会持有一个针对持久化对象的必选(第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用到。Transient:瞬态(transient)和脱管(detached)的对象及其集合,那些目前没有与session关联的持久化类实例。他们可能是在被应用程序实例化后,尚未进行持久化的对象。也可能是因为实例化他们的Session已经被关闭而脱离持久化的对象。5.2Hibernate的体系结构Transaction(org.hibernate.Transaction):事务Transaction是应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。某些情况下,一个Session之内可能包含多个Transaction对象。尽管是否使用该对象是可选的,但无论是使用底层的API还是使用Transaction对象,事务边界的开启与关闭是必不可少的。5.2Hibernate的体系结构ConnectionProvider此对象生成JDBC连接的工厂(同时也起到连接池的作用)。它通过抽象将应用从底层的Datasource或DriverManager隔离开。仅供开发者扩展或实现用,并不暴露给应用程序使用。TransactionFactory(org.hibernate.TransactionFactory)对象生成Transaction对象实例的工厂。仅供开发者扩展或实现用,并不暴露给应用程序使用。5.2Hibernate的体系结构JNDI(JavaNamingandDirectoryInterface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。JDBC(JavaDataBaseConnectivity,java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。5.2Hibernate的体系结构JTA,即JavaTransactionAPI,译为Java事务API。JTA允许应用程序执行分布式事务处理,在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序的JTA支持极大地增强了数据访问能力。5.3HibernateAPI简介Hibernate一共有6个核心接口:Configuration、SessionFactory、Session、Transaction、Query和Criteria。它们的关系如图5-3所示。5.3HibernateAPI简介Configuation接口Hibernate应用通过创建Configuration实例来指定对象-关系映射文件的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例。SessionFactory接口一个SessionFactory实例对应一个数据库连接,应用从SessionFactory中获得Session实例。SessionFactory有以下特点:5.3HibernateAPI简介它是线程安全的,它的实例可以被多个应用的线程共享。它是重量级的,不能随意创建或销毁它的实例。如果应用只访问一个数据库,只需要创建一个SessionFactory实例,在应用初始化的时候创建该实例。如果应用同时访问多个数据库,则需要为每个数据库创建一个单独的SessionFactory实例。5.3HibernateAPI简介Session接口Session接口是Hibernate应用中使用最多的接口。Session也被称为持久化管理器,它提供了和持久化相关的操作,如数据库的添加、删除、更新、加载和查询。Session有以下的特点:不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。Session实例是轻量级的,所谓轻量级,是指它的创建和销毁不需要耗费太多的资源。这意味着在程序中可能经常创建或销毁Session对象,例如可以为每个请求分配单独的一个session实例。5.3HibernateAPI简介Transaction接口Transaction接口是Hibernate的数据库事务接口,它对底层的事务接口做了封装,底层事务接口包括:JDBCAPIJTA(JavaTransactionAPI)CORBA(CommonObjectRequestBrokerArchitecture)API5.3HibernateAPI简介Query和Criteria接口Query和Criteria接口是Hibernate的查询接口,主要用于数据库对象查询,以及控制执行查询的过程。Qurey实例包装了一个HQL(HibernateQueryLanguage)查询语句,HQL查询语句与SQL查询语句有些相似,但HQL查询语句是面向对象的,它引用类名及类的属性名,而不是表名及表的字段名。Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更加面向对象,Criteria接口擅长于执行动态查询。Session接口的find()方法也具有数据查询功能,但它只是执行一些简单的HQL查询语句的快捷方法,它的功能远没有Query接口强大。5.4Hibernate的配置文件通过上一节的API接口之间的关系可知Hibernate进行持久化操作离不开SessionFactory对象,这个对象是整个数据库映射关系编译后的内存镜像,该对象通常由Configuration对象来产生。在创建Configuration对象之前可为其指定一个配置文件,这个配置文件保存了数据库连接信息,当创建对象时这个配置文件也会被一同加载到内存中。5.4Hibernate的配置文件随着Hibernate所使用配置文件的不同,创建Configuration对象的方式也不相同。通常有以下两种Hibernate的配置文件,perties和hibernate.cfg.xml文件。我们着重介绍常用的XML配置文件hibernate.cfg.xml。例5-1下面我们看一个简单的Hibernate.cfg.xml配置文件,这个配置文件是描述一个MySql数据库testdb的相关配置信息。,5.4Hibernate的配置文件<?xmlversion='1.0'encoding='UTF-8'?><!DOCTYPEhibernate-configurationPUBLIC"-//Hibernate/HibernateConfigurationDTD3.0//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <propertyname="connection.username">root</property> <propertyname="connection.url">jdbc:mysql://localhost:3306/testdb </property> <propertyname="dialect">org.hibernate.dialect.MySQLDialect </property> <propertyname="connection.password">11</property> <propertyname="connection.driver_class">com.mysql.jdbc.Driver </property> <mappingresource="com/ssh/book/entity/SysUser.hbm.xml"/> </session-factory></hibernate-configuration>5.4Hibernate的配置文件这是一个最基本的Hibernate配置文件,有了这个文件就可以创建Configuration对象,也就可以创建一个SessionFactory实例,有了这个实例就可以面向对象的方式操作数据库了。在hibernat.cfg.xml文件中都是以属性的方式来配置相关信息的,下面的表中列出一些常用的属性及其含义。5.4Hibernate的配置文件hibernate.connection.driver_class设置连接数据库的驱动。如MySql数据库的驱动:com.mysql.jdbc.Driverhibernate.connection.url设置所需连接数据库服务的URL。如连接MySql数据库的字符串为:jdbc:mysql://localhost:3306/testdb,其中testdb为连接的具体数据库的名字。hibernate.connection.username连接数据库的用户名。如连接MySql数据库的默认用户名为:roothibernate.connection.password连接数据库的密码hibernate.connection.dialect设置连接数据库所用的方言。如MySql数据库的方言为Mysql。hibernate.connection.datasource指定数据源JNDI名字。如果数据源是JNDI则用到此属性。hibernate.connection.jndi.url指定JNDI提供者的URL,此项可选hibernate.sho_sql设置是否在控制台上输出Hibernate生成的SQL语句。只能为true和false。此项在调试程序时是非常有用的。hibernate.connection.jndi.class指定JNDIinitialContextFactory的实现类,此项可选hibernate.cache.use_query_cache设置是否允许查询缓存hibernate.cache.use_second_level_cache用于设置是否启用二级缓存hibernate.max_fetcdh_depth设置外连接抓取的深度5.5Hibernate中的持久化类持久化类是指需要被Hibernate持久化到数据库中的实例所对应的类。Hibernate采用的是低入侵式的设计,所以对持久化类没有作任何要求,Hibernate中操作的持久化类对象都是普通的Java类对象,我们也称为POJO,与普通的JavaBean没有什么区别,但有些规则还是要遵守的。5.5Hibernate中的持久化类持久化类必须有一个无参的构造方法:持久化类必须有一个唯一标识属性持久化类的每个属性必须提供setXXX()和getXXX()方法持久化类何时需要实现java.io.Serializable接口,这取决于应用环境:对于采用分布式结构的Java应用,当java对象在不同的进程节点之间传输时,这个对象所属的类必须实现Serializable接口.此外,在JavaWeb应用中,如果希望对HttpSession中存放的对象进行持久化,那么这个Java对象所属的类也必须实现Serializable接口。5.5Hibernate中的持久化类Hibernate的持久化对象有以下三种状态。瞬态:对象由new操作符创建,且尚未与HibernateSession关联的对象被认为处于瞬态。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识。如果程序中失去了瞬态对象的引用,瞬态对象将被自动回收。使用HibernateSession可以将其变为持久化装态。持久化:持久化实例在数据库中有对应的记录,并拥有一个持久化标识。持久化实例可以是刚刚保存的,也可以是刚被加载的。无论哪一种,持久化对象都必须与指定的HibernateSession关联。Hibernate会检测到处于持久化状态对象的改变,在对象操作完成时会将对象数据自动写回数据库。5.5Hibernate中的持久化类脱管:某个实例曾经处于持久化状态,但随着与之关联的Session被关闭,该对象就变成了脱管装态。脱管对象的引用依然有效,对象可继续被修改。如果重新让脱管对象与某个Session关联,这个脱管对象会重新转换为持久化装态,而脱管期间的改动也不会丢失,也可被写入数据库。对象状态转换如图5-4所示5.5Hibernate中的持久化类对象状态转换图5.5Hibernate中的持久化类给出MySql数据库testdb中的部门表department对应的POJO(普通Java类对象),表的结构为:depId[Integer]、depName[varchar(45)]、depFlag[char(1)]。Department.java代码如下:5.5Hibernate中的持久化类privateIntegerdepId; privateStringdepName; /**defaultconstructor*/ publicDepartment(){ } /**minimalconstructor*/ publicDepartment(StringdepName,StringdepFlag){ this.depName=depName; } publicIntegergetDepId(){ returnthis.depId; } publicvoidsetDepId(IntegerdepId){ this.depId=depId; } publicStringgetDepName(){ returnthis.depName; } publicvoidsetDepName(StringdepName){ this.depName=depName; }}5.5Hibernate中的持久化类这是一个普通的Java类,没有父类也没有实现任何接口,类中的属性与表中的属性是一一对应的,数据库的数据类型要转换为相应的Java数据库类型,每个属性要有相应的set和get方法,还要有一个默认的构造方法。这实际上就是一个普通的JavaBean。5.6Hibernate的对象-关系映射文件Hibernate采用XML格式的文件来指定对象和关系数据库之间的映射。在程序运行时,Hiberante将根据这个映射文件来生成各种SQL语句。一般的数据库中一个表对应一个映射文件,这些映射文件的结构基本上是相同的。每个映射文件的内容主要是以XML的方式描述数据库表的相关信息。5.6Hibernate的对象-关系映射文件例5-3数据表department的映射文件。数据库testdb中的部门表department在MySql中的结构如下图所示,这个表一共有三个属性:depId(INTEGER)、depName(VARCHAR)、depFlag(CHAR),其中depId是主键,并且是自动增长的。在Hibernate中对应的映射文件Department.hbm.xml的代码如下:5.6Hibernate的对象-关系映射文件<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping><classname="com.entity.Department"table="department"catalog="testdb"><idname="depId"type="java.lang.Integer"><columnname="depId"/><generatorclass="native"/></id><propertyname="depName"type="java.lang.String"><columnname="depName"length="45"not-null="true"/></property></class></hibernate-mapping>5.6Hibernate的对象-关系映射文件文档中的元素及其属性的含义解释如下。<class>元素:一个<class>对应一个持久化类,每个持久化类对应一个数据表。Name属性指定类所在的包和类的名字,table属性指定了数据表的名字,catalog指定了数据表所在数据库的名字。<id>元素:<id>是<class>的子元素。由于表中的每个记录都有一个唯一标识,对应的类的实例也要有一个唯一的标识属性,这是通过<id>子元素定义的,<id>元素的name属性定义了持久化类的唯一标识属性变量,type属性定义了变量的数据类型,这里的数据类型可以是java的数据类型也可以是Hibernate的数据类型,我们这里是java的数据类型。5.6Hibernate的对象-关系映射文件<column>元素:<column>是<id>的子元素。它是用来指定数据表中的标识列的名字的。<generator>元素:<generator>是<id>的子元素。它是用来指定唯一标识的生成方式,是标识符生成器,最终是以什么方式生成标识符是由class属性的值来决定的。Class属性的值及其含义如表5-2所示。表5-2Class属性的值及其含义5.6Hibernate的对象-关系映射文件Class的值含义increment适用于代理主键。由Hibernate自动以自增的方式生成标识符,每次增量为1identity适用于代理主键。由底层数据库生成标识符,前提条件是底层数据库支持自动增长字段类型sequence适用于代理主键。Hibernate根据底层数据库的序列来生成标识符,前提条件是底层数据库支持序列hilo适用于代理主键。适用于代理主键。Hibernate根据high/low算法来生成标识符native适用于代理主键。根据底层数据库对自动生成标识符的能力来选择identity、sequence或hilouuid.hex适用于代理主键。Hibernate采用128位的UUID算法生成标识符,UUID算法能够生成网络环境中的唯一字符串标识assigned适用于自然主键。由Java应用程序负责生成标识符5.6Hibernate的对象-关系映射文件<property>元素:<property>元素是<class>的子元素,每个<class>可以有0个或多个<property>子元素,它的多少取决于数据表中属性列的个数。<property>是用来指定与数据表的属性列对应的持久化类中的属性变量的。name属性指定了持久化类中变量的名字,type属性指定属性变量的数据类型。<column>元素:<column>是<property>的子元素,它主要描述数据表属性列的相关信息。<column>的name属性指定了持久化类对应的数据表中的属性列的名字,它的length属性指定了字符串的最大长度限制,not-null指定此列是否允许为空的限制。5.7通过HibernateAPI操纵数据库Hibernate对JDBC进行了封装,提供了面向对象的API来操作数据库。如图5-6所示为通过HibernateAPI访问数据库的示意图Java应用HibernateAPIJDBCAPI数据库5.7通过HibernateAPI操纵数据库在Hibernate中要想通过API操作数据库,必须先获得一个Session对象,通过这个对象的相关方法才可以操作数据库。获取对象的步骤如下:创建一个Configuration类的实例,Configuration类的构造方法把默认文件路径下的Hibernate配置文件hibernate.cfg.xml中信息读入内存,示例代码如下:Configurationconf=newConfiguration();调用Confgiuration对象的buildSessionFactory()方法得到一个SessionFactory类的实例,示例代码如下:SessionFactorysf=conf.buildSessionFactory();调用SessionFactory对象的OpenSession()方法可获得一个Session类的实例,示例代码如下:Sessionsession=sf.openSession();5.7通过HibernateAPI操纵数据库Session接口提供了操纵数据库的各种方法,常用的方法原型如下:Serializablesave(Objectobj):将对象obj变为持久化状态,同时保存到数据库中。voidupdate(Objectobj):更新数据库的obj对象,此时是先在数据库中根据UID查找记录,然后更新。这里执行了两次SQL语句。voiddelete(Objectobj):根据对象obj中的UID从数据库删除相应的记录。Objectload(Classarg0,Serializablearg1):这里的arg0是代表某一个具体的类,arg1是一个实现了Serializable的对象,如Integer就实现了Serializable。作用是根据主键加载一个对象到内存中。5.7通过HibernateAPI操纵数据库Objectget(Classarg0,Serializablearg1):这个方法的作用与load方法相同,但区别是load具有延迟加载的功能,不会立即访问数据库,在需要的时候再访问数据库。而get方法是立即访问数据库并返回相应的对象,如果对象不存在则反回null。

以上只是sessin的几个常用方法,session还有很多方法,详细的介绍可参考API文档。下面是一个用HibernateAPI操作数据表的实例。例5-4Hibernate对数据表department进行增、删、改和查的操作。5.8在MyEclipse中使用Hibernate在MyEclipse工程中应用Hibernate框架有以下四个步骤:创建Java项目

创建Java项目工程chap5,在src下

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论