关闭

关闭

关闭

封号提示

内容

首页 chap03 感悟Hibernate操作数据的方便技术资料.pdf

chap03 感悟Hibernate操作数据的方便技术资料.pdf

chap03 感悟Hibernate操作数据的方便技术资料.p…

上传者: zhuchengdie 2012-07-25 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《chap03 感悟Hibernate操作数据的方便技术资料pdf》,可适用于IT/计算机领域,主题内容包含第章感悟Hibernate操作数据的方便对于JEE轻量级架构而言Hibernate是一个重要的构成部分它让开发人员像存取java对象一样存储数据St符等。

第章感悟Hibernate操作数据的方便对于JEE轻量级架构而言Hibernate是一个重要的构成部分它让开发人员像存取java对象一样存储数据Struts和Spring尽管基于MVC但更多的是基于业务逻辑和视图层的架构在数据层仅仅是轻描淡写如果不使用Hibernate它们往往会使用传统的JDBC做为其数据层。本章首先将比较JDBC技术的各种不方便之处然后提出ORM概念最后将介绍Hibernate技术。前提工作本章所有的示例都基于一个测试数据库testdb使用的是MySql数据库版。假设读者已经安装好MySql。所以关于MySql的安装这里不再介绍笔者向大家介绍一个非常实用的MySql客户端软件SQLyog可以通过http:wwwgooglecom得到这个软件的非常多的下载网页。SQLyog的安装非常简单一直保持默认单击Next按钮就可以。这里只介绍下如何配置SQLyog(英文原版)使其连接一个具体的MySql服务。安装好后的SQLyog会在桌面产生一个快捷方式如图所示:图SQLyog快捷方式双击此快捷方式进入到登录界面如图所示:图配置sqlyog界面上面是一个已经配置好了的界面下面简单讲解下zMySQLHostAddress这个是MySQL服务的IP地址由于笔者的MySQL和SQLyog都是安装在同一台电脑上所以使用localhost就可以。zUsername:是连接MySQL的用户名这里使用具有最高权限的root。zPassword是密码。zPort是MySQL的监听端口它是安装MySQL时候指定的端口这里是(可能你的MySQL是)。配置好后单击connect按钮如果连接成功的话就会出现到SQLyog的主界面如图所示:图SQLyog的主界面从这个主界面的可以看到已经建立好的book等数据库现在需要为本章新建一个数据库testdb在菜单栏中选择DB|CreateDatabase命令将弹出一个输入窗口如图所示:图新建数据库输入新建的数据名称testdb单击Create按钮将完成数据库的创建这时候可以在数据库导航栏中看到新建的testdb如图所示:图新建好的数据库testdb接下来需要在这个数据库中新建三张本章示例将使用到的表:学生基本信息表课程基本信息表学生选课关系表。在testdb选择状态下(如图)在菜单栏中选择DB|CreateTable命令将出现表创建界面如图所示:图创建学生基本信息表在此图中FileName是表格列名Datatype是列的数据类型Len是长度图创建的是学生基本信息表它包括:zStuid学号同时也是主键。zStuname是学生姓名zgendar是性别。单击CreateTable…按钮后按照提示输入表名stubasicinfo学生基本信息表就算创建完毕。然后使用同样的办法分别创建课程基本信息表(coursebasicinfo)如图所示:图课程基本信息表zcourseid是唯一标识一个课程的主键idzcoursename是课程名称zdescription是关于课程的描述信息接下来创建选课关系表sturelationcourse如图所示:图学生选课关系表zStuid选课学生学号外键zCourseid课程id外键zChoicedate选课日期Stuid和courseid都是外键在上面的GUI界面中无法为一张正在创建的表指定外键指定外键的办法是选中选课关系表sturelationcourse如图所示:图选择表sturelationcourse然后选择菜单栏中的Table|RelationshipsForeignKeys…命令或者按F弹出创建外键的对话框如图所示:图创建外键对话框单击New按钮弹出如图的对话框。图SQLyog中创建外键向导在ReferencedTable的下拉菜单中选择表stubasicinfo,在ConstraintName中填写一个名称在SourceColumn中选择stuid在TargetColumn中也选择stuid。最终配置好的界面如图所示:图设置学生号为外键单击Create按钮完成创建并使用同样的办法为课程号也创建成外键。当然上面是采用图形界面的操作方式创建表和它的约束也可以直接使用sql语句的办法比如学生选课关系表的创建SQL为:CREATETABLE`sturelationcourse`(`stuid`varchar()default,`courseid`int()default,`choicedate`datedefault,KEY`FKstuid`(`stuid`),KEY`FKcourseid`(`courseid`),CONSTRAINT`FKcourseid`FOREIGNKEY(`courseid`)REFERENCES`coursebasicinfo`(`courseid`),CONSTRAINT`FKstuid`FOREIGNKEY(`stuid`)REFERENCES`stubasicinfo`(`stuid`))ENGINE=InnoDBDEFAULTCHARSET=gbk对于上面这段Sql语句不同的数据库可能会有所差异。下面的一个工作就是为这三张表填充测试数据首先为学生基本信息表填充测试数据在SQLyog中编辑一个表的操作是十分方便的做法是选中需要修改的表如学生基本信息表stubasicinfo然后单击TableData标签页如图所示:图学生基本信息stubasicinfo表图中可见已经为学生基本信息表添加了张三等三人的基本信息(不要忘记单击“保存”按钮才能生效)。使用同样的操作方式为课程基本信息填充测试数据如图所示:图课程基本信息表所有测试数据最后一个是学生选课关系表如图所示:图学生选课关系表一个成熟的数据库管理系统都具有权限机制以上的操作是通过root即具有顶级权限的用户登录到数据库中的而在应用程序中可能是不安全或者干脆是不允许的因此最好单独为应用程序分配角色和用户。在SQLyog中创建一个用户角色是非常方便的选中testdb这个表单击它然后在菜单栏中选择Tools|UserManager|AddUsers…命令将弹出如图所示的对话框:图添加用户对话框zUserName:添加一个用户名这里已经添加为testzHost:主机名称保持默认zPassword:密码这里为testzRetypePassword:重新输入密码可以看到不同版本的MySQL支持不一样的权限为了简单起见这里单件selectAll从而使得test这个用户具有了所有权限最后单击Create按钮完成对test用户的创建。前期的数据库初始化工作到此完成。传统的JDBC方式连接数据库介绍JDBC是一组封装了底层数据库细节的JavaAPI就其功能本身而言并没什么可以挑剔而且的确需要承认JDBC的稳定和功能齐全。但它的一个最大的缺点是不容易使用要熟悉的使用JDBC对于普通程序员来说仍然是一件困难不小的事情。下面举一例来说明这一问题针对中创建的testdb如果提出一这样的一个需求:将张三的选课信息列出来我们期望得到的结果如图所示:图张三的选课信息下面使用程序实现以MyEclipse为例使用在前几章介绍的知识在MyEclipse中创建一个JavaProject命名为:hibernate。(后面介绍Hibernate时候仍然使用这个工程)创建好后的工程如图所示:图名为hibernate的一个JavaProject正如图中所示一个普通的java工程其最原始的面貌是非常简洁的下一步是需要导入连接MySQL数据库所需要的jar包。它是必须的JDBC必须通过它才能访问MySQL数据库同样的如果是其它数据库比如Oracle也需要类似的包。在这里我们可以使用mysqlconnectorjavabinjar(笔者的Mysql数据库是版本)这个包可以从Mysql的官方网站上下载到。如果你的MySQL数据库是其它版本则必须使用对应的版本的驱动包。下载完毕后在MyEclipse中选择hibernate这个工程如图就是是选中状态右击选择buildpath|AddExternalArchives…命令将弹出如图所示的文件选择对话框:图文件选择对话框正如你所见文件类型只能是jar或者zip。为什么zip也是可以的呢?事实上jar包是一种压缩了的文件而使用的压缩算法恰好是zip。选择图中的jar包单件“打开”按钮就能完成jar包的导入。导入包后的hibernate这一工程如图所示:图包导入后的hibernate接下来的工作是编写代码需要做的是在hibernate这个工程中创建一个包命名为test然后在test包下新建一个类命名为TestJDBC创建好后的hibernate工程如图所示:图TestJDBC创建完后的hibernate最后一件事情是在TestJDBC编写实际的java代码针对本节开始提出的需求编写代码如下所示(代码具体内容的含义会在后面详细讲解):packagetestimportjavasqlConnectionimportjavasqlDriverManagerimportjavasqlResultSetimportjavasqlResultSetMetaDataimportjavasqlStatementimportjavatextSimpleDateFormatimportjavautilDate***使用JDBC方式访问数据库*authorAdministrator**publicclassTestJDBC{***连接数据库的库名用户密码信息*privatestaticStringurl="jdbc:mysql:localhost:testdb"privatestaticStringusername="test"privatestaticStringpassword="test"***一个连接一个对象只会产生一个连接*privateConnectioncon***一个语句每个操作都会产生一个语句*privateStatementstmt***装载驱动并确保系统启动后只装载一次。*static{try{ClassforName("commysqljdbcDriver")}catch(Exceptione){Systemoutprintln(egetMessage())}}***构造函数*publicTestJDBC(){try{创建一个连接setCon(DriverManagergetConnection(url,username,password))}catch(Exceptione){eprintStackTrace()}}***执行一条sql语句简单起见将结果以String类型二维数组的形式返回*publicStringexecQuery(Stringsqlstr){try{try{创建一个statementsetStmt(getCon()createStatement(ResultSetTYPESCROLLINSENSITIVE,指定游标类型ResultSetCONCURUPDATABLE))sqlserver不支持这种游标类型并发组合}catch(Exceptionee){专为sqlserver设置游标类型并发组合setStmt(getCon()createStatement(ResultSetTYPESCROLLINSENSITIVE,ResultSetCONCURREADONLY))}ResultSetrs=getStmt()executeQuery(sqlstr)将sqlstr发送给数据库并执行ResultSetMetaDatarsmd=rsgetMetaData()使用这个结果集是为了得到列的信息而这在ResultSet中是无法获得的intcollen=rsmdgetColumnCount()得到列的个数rslast()游标指向最后一行Stringresult=newStringrsgetRow()collenrsbeforeFirst()将游标重新指向第一行的前一行while(rsnext()){遍历结果集for(inti=i<=colleni){Stringdata=""Objectobj=rsgetObject(i)返回的结果都是对象if(objinstanceofDate){对日期类型的对象进行格式化处理这里不是必须的。Datets=(Date)objSimpleDateFormatformat=newSimpleDateFormat("yyyyMMdd")data=formatformat(ts)}else{try{data=(String)obj为了简单起见将所有的类型强制类型转化为字符串类型}catch(Exceptione){data=objtoString()}}resultrsgetRow()i=data}}returnresult}catch(Exceptione){eprintStackTrace()}return}getter和setter方法区publicConnectiongetCon(){returncon}publicvoidsetCon(Connectioncon){thiscon=con}publicStatementgetStmt(){returnstmt}publicvoidsetStmt(Statementstmt){thisstmt=stmt}关闭资源publicvoidclose(){try{getStmt()close()getCon()close()}catch(Exceptione){eprintStackTrace()}}publicstaticvoidmain(Stringargs){TestJDBCjdbcobj=newTestJDBC()实例化对象编写sql查询语句Stringsqlstr="selectsstuid,sstuname,sgendar,scoursename,sdescription,""schoicedatefromstubasicinfos,sturelationcourses,""coursebasicinfoswheresstuid='A'and""sstuid=sstuidandscourseid=scourseid"执行sql并得到结果Stringresult=jdbcobjexecQuery(sqlstr)输出结果printResult(result)关闭资源jdbcobjclose()}输出打印结果privatestaticvoidprintResult(Stringresult){Systemoutprintln("学号姓名性别课程名课程描述选课日期")for(inti=i<resultlengthi){for(intj=j<j){Systemoutprint(resultij"")}Systemoutprintln("")回车}}}针对上面这段代码下面给出详细的讲解使用JDBC访问数据库有一个固定的顺序:z装载驱动这是一切工作之前的首要工作这体现在下面这段代码:***装载驱动并确保系统启动后只装载一次。*static{try{ClassforName("commysqljdbcDriver")}catch(Exceptione){Systemoutprintln(egetMessage())}}这里使用static方式执行一段静态的代码它所带来的好处是这段代码永远只会执行一次因为装载驱动这个工作一次装载完毕后面再对数据库进行访问时不需要重新装载如果每次都重新装载必定会使得性能大大降低。其次commysqljdbcDriver这个类是存在mysqlconnectorjdbcbinjar这个包中的如果在先前没有导入这个包那么这里就会出现javasqlSQLException:Nosuitabledriver错误。z建立connection每次对数据库的访问都需要动态的与数据库创建一个连接然后的增删改查等动作都是在这个连接下进行的TestJDBC体现这一点的代码在它的构造函数上:***构造函数*publicTestJDBC(){try{创建一个连接setCon(DriverManagergetConnection(url,username,password))}catch(Exceptione){eprintStackTrace()}}使用构造函数建立连接使得用户实例化一个TestJDBC对象时候就已经完成了连接的创建自然也完成了驱动的装载。z创建statement对每一个sql语句被执行前都要创建一个statement在TestJDBC中体现在下面这段代码:try{创建一个statementsetStmt(getCon()createStatement(ResultSetTYPESCROLLINSENSITIVE,指定游标类型ResultSetCONCURUPDATABLE))sqlserver不支持这种游标类型并发组合}catch(Exceptionee){专为sqlserver设置游标类型并发组合setStmt(getCon()createStatement(ResultSetTYPESCROLLINSENSITIVE,ResultSetCONCURREADONLY))}从代码中可以看到建立一个连接的关键代码是使用connection对象的createStatement方法这也是为什么必须在此之前创建connection对象。上面这段代码可能读者会比较难以理解主要是createStatement的两个参数它们在这里不是必须的表示的是游标类型。对于本示例而言完全可以去掉里面参数使得它变成为setStmt(getCon()createStatement())不过笔者想告诉大家的是在某些场合这两个参数是非常有必要的。对于mysql,Oracle数据库使用try中的方式完全没有问题而对于sqlserver数据库则会抛出异常而不得不使用catch中的那种方式。这体现了一点:JDBC程序员要关心的不仅仅是业务逻辑还有各种数据库系统的差异。z执行sql语句上面的工作就绪后就可以通过调用statement对象的executeQuery()方法执行sql语句了TestJDBC中体现这点的核心代码是:ResultSetrs=getStmt()executeQuery(sqlstr)将sqlstr发送给数据库并执行ResultSetMetaDatarsmd=rsgetMetaData()使用这个结果集是为了得到列的信息而这在ResultSet中是无法获得的通过代码可以看到执行sqlstr的结果被封装在一个ResultSet对象中而最难堪的是它并不包含所有信息比如要取得列的个数信息还必须得借助于ResultSetMetaData。这也是JDBC难以使用的另一个原因。z关闭资源JDBC程序员必须要养成的一个好习惯的是在资源使用完毕后关闭它。TestJDBC中体现这点的代码是:关闭资源publicvoidclose(){try{getStmt()close()getCon()close()}catch(Exceptione){eprintStackTrace()}}通过代码可以看到需要关闭的资源主要是statement和connection。如果一个大意的JDBC程序员总是忘记完毕资源那么后果尽管不会太严重但数据库因此而无法访问或者抛出奇怪的异常则是完全有可能的。通过以上的分析可以总结出使用传统的JDBC连接数据库的几大弊端:()步骤复杂尽管可以将装载驱动建立连接创建语句等步骤封装起来使其变成一个通用的访问接口但对于没有良好的通用编程能力的JDBC程序员而言则是一件比较困难的事情于是会导致像TestJDBC这样的代码在整个应用中到此可见。如果某个地方需要修改比如数据库连接地址或者用户名或者密码则到处要修改。()需要编写长长的sql语句对于本节开始处“将张三的选课信息列出来”这一需求并不算复杂但是需要为此编写的sql语句却一点也不简洁如下所示:编写sql查询语句Stringsqlstr="selectsstuid,sstuname,sgendar,scoursename,sdescription,""schoicedatefromstubasicinfos,sturelationcourses,""coursebasicinfoswheresstuid='A'and""sstuid=sstuidandscourseid=scourseid"从一堆单引号中推测一段sql语句的意图是一件不容易的事情。但是当需求变更的时候则又是一件不得不做的苦差事如果你用JDBC编程的话。()平台移植困难突然哪天mysql变得不堪重负而需要将其移植到oracle或者sqlserver时上面的代码是否可以保证在一丝不动的情况下还能正常的工作则是一个疑问。不然也不会在创建statement编写参数的时候有那么多的顾虑了。()意外的性能损失理论上来说采用最原始的方式其性能应该是最好的。不否认这个事实,但是其前提是JDBC程序员足够的了解JDBCAPI。举个例子如果现在有一个新的需求要求在stubasicinfo表中插入条数据或者更多。JDBC程序员一不小心就会使用一个for循环创建条insert语句然后一条一条的插入。事实上使用JDBC的批处理功能可以大大的提高性能。于是不得不说“如果你有过多的选择就必然会迷失方向”。ORM简介和Hibernate概述既然JDBC有如此多的缺点那么是否可以找到一个更好的办法用来弥补这些不足呢。幸运的是这种办法已经被提升到理论的高度人们称其为ORM思想。本节将讲述ORM思想的基本概念和一个实现了ORM思想的实体Hibernate的概述。ORM简介ORM的全称是(ObjectRelationalMapping)意为“对象关系映射”。这里的关系与关系数据库中的关系是一个概念。早在数据库这个概念提出的年代人们就探讨以什么样的形式存储数据主要有三种形式的讨论:面向层次结构面向关系结构面向对象。三种方式都有各种的优缺点但是面向关系是最成熟最具有数学依据一种方式于是面向关系的数据存储方式至今仍然是主流。尽管使用面向关系的方式存储数据是成熟和合理的但是在使用面向关系方式访问和操作数据则是一件不容易的事情它是导致在应用程序中编写长长sql语句的根本原因典型的是JDBC方式的数据访问。ORM是针对面向关系返回数据方式的缺点而提出的一种数据访问方式ORM旨在寻找一种关系到对象的映射关系使得程序开发人员能像操控对象一样操作关系数据库中的数据。对于一个使用面向对象的语言进行面向对象的开发的程序员而言使用面向对象的方式操作数据是在自然不过的了。Hibernate概述隶属于Jboss组织的Hibernate是目前比较流行的一个ORM组件它实现了ORM的框架构思成功的将关系数据映射为普通对象。不仅仅如此Hibernate包括众多的方便的API供开发人员使用并且有自己的查询体系HQL。目前的Hibernate相关开发包主要包括以下几个:zHibernateCore这个包包含了所有Hibernate的核心功能理论上来说使用这一个包就可以使用Hibernate进行开发应用。zHibernateTools这个软件包主要用来完成逆向或者正向工作。正向工作是指根据Java对象生成Hibernate配置文件。逆向工作是根据数据库结构生成Hibernate配置文件和Java对象。zHibernateEntityManager这个包是针对EJB规范而开发出来的它实现了EJB中定义的接口。zHibernateAnnotations这个包主要用来完成一些特殊的注释比如HibernateValidator框架中使用的验证注释。zNhibernate这个包也包含了Hibernate的核心功能与HibernateCore不同的是它是用于Net环境。Hibernate下载和使用本节将讲述如何获得Hibernate并通过一个具体实例讲解Hibernate的使用。Hibernate的下载可以从官方网站http:wwwhibernateorg中下载到中提到的各种包一般下载HibernateCore包就可以了。如果是使用MyEclipse这样的IDE工具则不需要下载MyEclipse集成了Hibernate。Hibernate的使用以在MyEclipse中为例编写一个使用Hibernate的例子。需求是:基于节创建的testdb和节中的工程hibernate,打印所有学生的基本信息即将stubasicinfo表中的所有数据打印在控制台。详细步骤如下:在MyEclipse的菜单栏中选择Window|OpenPerspectives|MyEclipseDatabaseExplorer命令中打开透视图MyEclipseDatabaseExplorer如图所示:图DatabaseExplorer透视图在上图中可以看到视图DBBrowser。在其空白处右击选择New命名将弹出如图所示的对话框:图数据库配置对付框各个选项的基本含义如下:zDrivertemplate:驱动模板对于不同的版本不同类型的数据库驱动模板都是不同的zDrivername:驱动名称可以任意写zConnectionURL:连接URL地址这和在应用程序中编写的连接数据库地址是一样的不同的数据库这个地址的写法也不一样。zUsername:连接数据库的用户名它必须是在数据库中存在的用户名zPassword:连接数据库的密码zDriverJARs:连接数据库需要使用到的驱动包不同的数据库驱动包不一样。zDriverclassname:使用的驱动类由于一个包中往往会有多个可选的驱动。一般保持默认即可下面是针对testdb数据库的配置如图所示:图配置testdb单件Finish按钮就可以完成配置。在DatabaseExplorer中配置好数据库后回到JavaPerspective将工程hibernate中的mysql驱动包去掉因为在节加入了此包而这里已经不再使用这种方式添加驱动包。去掉一个外部连接的jar包的办法是选中这个jar包右击选择”BuildPath|RemovefromBuildPath”命令。接下来要做的是要为hibernate这个工程添加hibernate的核心包。有两者办法一种是从官方网站下载到这些包然后使用外部连接的办法导入。另一种办法是使用MyEclipse自带的Hibernate能力。方法是在工程被选中的状态下选择MyEclipse|AddHiberateCapabilities…命令将弹出如图所示的对话框:图为工程添加Hibernate这是一个库的选择界面保持默认选择最新版本的CoreLibraries就可以。单件Next按钮进入如图所示的对话框:图配置文件的存放路径设置这里需要解释的是ConfigurationFolder它是指hibernate的一些配置文件存放的路径。如果选择则默认为default包。ConfigurationFileName是Hibernate配置文件的名称它是可以修改的不过一般保持默认。关于这些配置文件的具体含义会在后面讲解。这里不做任何修改单件Next按钮进入下一步如图所示:图选择数据库对话框在DBDriver中选择刚才在DatabaseExplorer中的配置好了的testdb。后面的选项将自动填充如图所示:图选择数据源单击Next按钮进入下一步如图所示:图配置sessionFactory这一步是用来配置sessionFactory的可以跳过去但是建议配置一下其中Javasourcefolder是java程序的文件夹可以任意设置JavaPackage是包也可以任意设置。配置好的sessionFactory如图所示图配置好了的SessionFactory单件Finish按钮就可以完成Hibernate的添加。最后的工程hibernate如图所示:图具有Hibernate能力的工程hiberante接下来的事情是需要对testdb进行逆向工程。用前面的办法再次打开MyEclipseDatabaseExplorer然后在DBBrowser中选中testdb点击如图所示的图表按钮从而打开testdb的连接。图OpenConnection图标展开testdb数据库直到可以看到其所有表如图所示:图testdb的所有表选中其中的stubasicinfo有表右击选择HibernateReverserEngineering将弹出如所示的配置对话框:图配置hibernate逆向文件zJavasrcfolder:一般在这里选择一个工程的src目录。是hibernate逆向工程的目标工程zJavapackage:这是Hibernate配置文件所存放的包目录它相对于Javasrcfolder如果这个包不存在则会自动创建就象这里的hibernateConfig。zHibernatemappingfile:这是Hibernate各个表的映射文件zJavaDataObject:关系表通过ORM映射后生成的JavaBeanzJavaDataAcessObject(DAO):对象的操作类这里暂时不用关系其具体的含义单击Finish按钮等待逆向工程完成后打开MyEclipseJEE透视图发现现在的hibernate工程多了很多自动生成的代码或配置文件如图所示:图逆向工程后的hibernate工程仔细分析一下这个代码结构hibernateConfig包下包含了自动生成的DAO和hbmxml文件以及SessionFactory类(之前test目录下的SessionFactory类可以删除)以及JavaBean。在hibernate工程的根目录下另一个重要的配置文件是hibernatecfgxml。这是一个最基本的Hibernate应用所具有的代码架构下面针对各类文件概要的讲解其在Hibernate中的地位和作用。zHibernateSessionFactory:一个实现工厂模式的用类管理数据库连接的类这个类由MyEclipse自动生成便于理解笔者为其加入了中文注释代码如下所示:packagehibernateConfigimportorghibernateHibernateExceptionimportorghibernateSessionimportorghibernatecfgConfiguration***ConfiguresandprovidesaccesstoHibernatesessions,tiedtothe*currentthreadofexecutionFollowstheThreadLocalSession*pattern,see{linkhttp:hibernateorghtml}*publicclassHibernateSessionFactory{***Locationofhibernatecfgxmlfile*LocationshouldbeontheclasspathasHibernateuses*#resourceAsStreamstylelookupforitsconfigurationfile*Thedefaultclasspathlocationofthehibernateconfigfileis*inthedefaultpackageUse#setConfigFile()toupdate*thelocationoftheconfigurationfileforthecurrentsession*cfg配置文件所在的位置privatestaticStringCONFIGFILELOCATION="hibernatecfgxml"privatestaticfinalThreadLocal<Session>threadLocal=newThreadLocal<Session>()privatestaticConfigurationconfiguration=newConfiguration()privatestaticorghibernateSessionFactorysessionFactoryprivatestaticStringconfigFile=CONFIGFILELOCATIONstatic{try{装载配置文件configurationconfigure(configFile)实例化一个sessionFactorysessionFactory=configurationbuildSessionFactory()}catch(Exceptione){Systemerrprintln("ErrorCreatingSessionFactory")eprintStackTrace()}}privateHibernateSessionFactory(){}**从sessionFactory中得到一个session*ReturnstheThreadLocalSessioninstanceLazyinitialize*the<code>SessionFactory<code>ifneeded**returnSession*throwsHibernateException*publicstaticSessiongetSession()throwsHibernateException{Sessionsession=(Session)threadLocalget()if(session==||!sessionisOpen()){if(sessionFactory==){rebuildSessionFactory()}session=(sessionFactory!=)sessionFactoryopenSession():threadLocalset(session)}returnsession}**重新创建sessionfactory*Rebuildhibernatesessionfactory**publicstaticvoidrebuildSessionFactory(){try{configurationconfigure(configFile)sessionFactory=configurationbuildSessionFactory()}catch(Exceptione){Systemerrprintln("ErrorCreatingSessionFactory")eprintStackTrace()}}***Closethesinglehibernatesessioninstance*关闭session*throwsHibernateException*publicstaticvoidcloseSession()throwsHibernateException{Sessionsession=(Session)threadLocalget()threadLocalset()if(session!=){sessionclose()}}***returnsessionfactory**publicstaticorghibernateSessionFactorygetSessionFactory(){returnsessionFactory}***returnsessionfactory*设置配置文件*sessionfactorywillberebuildedinthenextcall*publicstaticvoidsetConfigFile(StringconfigFile){HibernateSessionFactoryconfigFile=configFilesessionFactory=}***returnh

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/45
0下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部