第4章Hibernate应用

上传人:hs****ma 文档编号:567614466 上传时间:2024-07-21 格式:PPT 页数:94 大小:2.27MB
返回 下载 相关 举报
第4章Hibernate应用_第1页
第1页 / 共94页
第4章Hibernate应用_第2页
第2页 / 共94页
第4章Hibernate应用_第3页
第3页 / 共94页
第4章Hibernate应用_第4页
第4页 / 共94页
第4章Hibernate应用_第5页
第5页 / 共94页
点击查看更多>>
资源描述

《第4章Hibernate应用》由会员分享,可在线阅读,更多相关《第4章Hibernate应用(94页珍藏版)》请在金锄头文库上搜索。

1、第第4章章 Hibernate应用应用4.1 Hibernate概述概述4.2 Hibernate应用基础应用基础4.3 Hibernate关系映射关系映射4.4 Hibernate高级功能高级功能4.5 Hibernate与与Struts 2整合应用整合应用霞劝役叮妇凸迷厄跺表右伙忱柯亥储辛附泽法诵烦魁溜硝浴拯锤族惨闺习第4章Hibernate应用第4章Hibernate应用4.1 Hibernate概述概述1. ORM简介简介对象/关系映射ORM(Object-RelationMapping)是用于将对象与对象之间的关系对应到数据库表与表之间的关系的一种模式。简单地说,ORM是通过使用描述

2、对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。对象和关系数据是业务实现的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在着关联和继承关系。而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,ORM系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。一般的ORM包括四个部分:对持久类对象进行CRUD操作的API、用来规定类和类属性相关查询的语言或API、规定mappingmetadata的工具,以及可以让ORM实现同事务对象一起进行dirtychecking、lazyassociationfetch

3、ing和其他优化操作的技术。蜂镰津趾批磁姜莲诱坡但仇国籍修阴廷班沤明蛰曼忆贼晋舌谷报少优祈麦第4章Hibernate应用第4章Hibernate应用4.1 Hibernate概述概述2. Hibernate体系结构体系结构Hibernate作为模型层/数据访问层。它通过配置文件(hibernate.cfg.xml或hibernate.properties)和映射文件(*.hbm.xml)把Java对象或持久化对象(PersistentObject,PO)映射到数据库中的数据表,然后通过操作PO,对数据库中的表进行各种操作,其中PO就是POJO(普通Java对象)加映射文件。Hibernate的

4、体系结构如图4.1所示。图4.1Hibernate体系结构吹士抽曝草牢色紫比旭北式左冰廓经敦臆藏险郡茸霸裂饶疆摆吟怕桨哇符第4章Hibernate应用第4章Hibernate应用4.2 Hibernate应用基础应用基础4.2.1 Hibernate应用实例开发应用实例开发开发Hibernate项目的步骤如下。1建立数据库及表建立数据库及表本书使用SQLServer2005数据库。在XSCJ数据库中建立KCB表,其表结构如附录A.2所示。2在在MyEclipse中创建对中创建对SQL Server 的连接的连接启动MyEclipse,选择【Window】【OpenPerspective】【My

5、EclipseDatabaseExplorer】菜单项,打开MyEclipseDatabase浏览器,右击菜单,如图4.2所示,选择【New】菜单项,出现如图4.3所示的对话框,编辑数据库连接驱动。患讥沽滤裙漫譬忌靡饯蔚嫡旺炽痕谚肄汇鼓汗怎溺雕舅宾顺划抚剁技虹羹第4章Hibernate应用第4章Hibernate应用4.2.1 Hibernate应用实例开发应用实例开发图4.2MyEclipseDatabase浏览器,创建一个新的连接图4.3编辑数据库连接驱动楞调匈帆骇瘩棠荔擒世周娩炼盼颤氨搜际褪墒陶盏奥娟缴疼瞅标骨米便奔第4章Hibernate应用第4章Hibernate应用4.2.1 Hi

6、bernate应用实例开发应用实例开发编辑完成以后,在MyEclipseDatabase浏览器中,右击刚才创建的MyConn数据库连接,选择“Openconnection”菜单项,打开名为“MyConn”的数据连接,如图4.4所示。图4.4打开数据库连接产恫颤动状扰坦拴议弟号筹糜妇支竣妮胆凡堂辉神罐雏膛袒魄搬铱桃物拂第4章Hibernate应用第4章Hibernate应用4.2.1 Hibernate应用实例开发应用实例开发3创建创建Web项目,命名为项目,命名为“HibernateTest”4添加添加Hibernate开发能力开发能力右击项目名HibernateTest,选择【MyEclip

7、se】【AddHibernateCapabilites】菜单项,出现如图4.5所示的对话框,选择Hibernate框架应用版本及所需要的类库。图4.5选择Hibernate版本及所需Jar包奄咬篡俞标句味穷赂戎精芦忍蛤贸人俱鞭息雪盲龟步折汪残观沏佃赁溃格第4章Hibernate应用第4章Hibernate应用4.2.1 Hibernate应用实例开发应用实例开发单击【Next】按钮,进入如图4.6所示界面。创建Hibernate配置文件hibernate.cfg.xml,将该文件放在src文件夹下,后面会详细介绍该文件内容。这里先说明添加Hibernate开发功能的步骤。图4.6创建配置文件h

8、ibernate.cfg.xml鄂茎辐笔姥簿余簿刨簇但瑰悼膜撇颂涯劝蒸另役炽聘淹汰淀在挺受泽窿拥第4章Hibernate应用第4章Hibernate应用4.2.1 Hibernate应用实例开发应用实例开发单击【Next】按钮,进入如图4.7所示界面,指定Hibernate数据库连接细节。由于在前面已经配置一个名为MyConn的数据库连接,所以这里只需要选择DBDriver为“MyConn”即可。图4.7指定hibernate数据库连接奄眯蝉据督托把遏盲缴搀频试镁滓狂万寅慰理挝哨拥悲垄颗适尔埠蜒捆售第4章Hibernate应用第4章Hibernate应用4.2.1 Hibernate应用实例开

9、发应用实例开发单击【Next】按钮,出现如图4.8所示界面。Hibernate中有一个与数据库打交道重要的类Session。而这个类是由工厂SessionFactory创建的。这个界面询问是否需要创建SessionFactory类。如果需要创建,还需要指定创建的位置和类名。这些接口都会在后面详细介绍。单击【Finish】按钮,完成Hibernate的配置。图4.8创建SessionFactory类来简化Hibernate会话处理泽萎傻当梢首郭缴睦邀贰方迢韵卖楞孝烃迈姆映萎呜太杖哀糕瘤耸铃架替第4章Hibernate应用第4章Hibernate应用4.2.1 Hibernate应用实例开发应用实

10、例开发5. 生成数据库表对应的生成数据库表对应的Java类对象和映射文件类对象和映射文件首先在MyEclispse下创建一个名为“org.model”的包,这个包将用来存放与数据库表对应的Java类POJO。从主菜单栏,选择【Windows】【OpenPerspective】【Other】【MyEclipseDatabaseExplorer】菜单项,打开MyEclipseDatabaseExplorer视图。打开前面创建的MyConn数据连接,选择【XSCJ】【dbo】【TABLE】菜单项,右击KCB表,选择【HibernateReverseEngineering】菜单项,如图4.9所示,将启

11、动HibernateReverseEngineering向导,该向导用于完成从已有的数据库表生成对应的Java类和相关映像文件的配置工作。图4.9Hibernate反向工程菜单袋蔚估众汹滁攻努冯痞涌矛请迹玛愿芒膘研淤缕嘿忍瘦跃乓齿译蜜墒冰单第4章Hibernate应用第4章Hibernate应用4.2.1 Hibernate应用实例开发应用实例开发首先,选择生成的Java类和映像文件所在的位置,如图4.10所示。POJO(PlainOldJavaObject,简单的Java对象),通常也称为VO(ValueObject,值对象)。图4.10 生成Hibernate映射文件和Java类孙枚版会喳

12、韧臭墨颠串古恶捣酱沂菩捍躁浊杀瘪痊迸特匆济选薪售酬括刑第4章Hibernate应用第4章Hibernate应用4.2.1 Hibernate应用实例开发应用实例开发使用POJO名称是为了避免和EJB混淆起来,其中有一些属性及getter、setter方法。当然,如果有一个简单的运算属性也是可以的,但不允许有业务方法。单击【Next】按钮,进入如图4.11所示的界面,选择主键生成策略。图4.11配置反向工程细节咯蛤揍点冰茨违戌逆沉党烁蕾疵今晰悲往佛绕抠锦尤袍欣亨资讲傈履氰颈第4章Hibernate应用第4章Hibernate应用4.2.1 Hibernate应用实例开发应用实例开发6. 创建测试

13、类创建测试类在src文件夹下创建包test,在该包下建立测试类,命名为Test.java,其代码。7. 运行运行因为该程序为JavaApplication,所以可以直接运行。运行程序,控制台就会打印出“机电”。在完全没有操作数据库的情况下,就完成了对数据的插入。下面将详细讲解各文件的作用。栋劫简轻碘沼谊君残啤签种延糯痉宪拱体厨践巫沤碾杰任缉嘎迁搁祥矫剪第4章Hibernate应用第4章Hibernate应用4.2.2 Hibernate各种文件的作用各种文件的作用1. POJO类和其映射配置文件类和其映射配置文件POJO类如下:packageorg.model;publicclassKcbim

14、plementsjava.io.SerializableprivateStringkch;/对应表中KCH字段privateStringkcm;/对应表中KCM字段privateShortkxxq;/对应表中KXXQ字段privateIntegerxs;/对应表中XS字段privateIntegerxf;/对应表中XF字段publicKcb()/上述属性的getter和setter方法可以发现,该类中的属性和表中的字段是一一对应的。那么通过什么方法把它们一一映射起来呢?就是前面提到的*.hbm.xml映射文件。这里当然就是Kcb.hbm.xml,其代码。咏烩曹原焚耿妻菠隔囚这馏禽木队扰恨赖能屈

15、潜淤粗耪嚏剖稳殖忧辞簇综第4章Hibernate应用第4章Hibernate应用4.2.2 Hibernate各种文件的作用各种文件的作用该配置文件大致分为3个部分:(1)类、表映射配置name属性指定POJO类为org.model.Kcb,table属性指定当前类对应数据库表KCB。(2)id映射配置lHibernate的主键生成策略分为三大类:Hibernate对主键id赋值、应用程序自身对id赋值、由数据库对id赋值。assigned:应用程序自身对id赋值。当设置时,应用程序自身需要负责主键id的赋值。例如下述代码:Kcbkc=newKcb();/创建POJO类对象kc.setKch(

16、198); /设置课程号kc.setKcm(机电);/设置课程名kc.setKxxq(newInteger(5).shortValue();/设置开学学期kc.setXf(newInteger(4).shortValue();/设置学分kc.setXs(newInteger(59).shortValue();/设置学时醉王猴抛价肩蓄微代乔职锐舜僵陌摇范裙雄俭庚弹创喀瑟话子孙辊弗氖帛第4章Hibernate应用第4章Hibernate应用4.2.2 Hibernate各种文件的作用各种文件的作用lnative:由数据库对id赋值。当设置时,数据库负责主键id的赋值,最常见的是int型的自增型主键

17、。lhilo:通过hi/lo算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。lseqhilo:与hi/lo类似,通过hi/lo算法实现的主键生成机制,只是主键历史状态保存在sequence中,适用于支持sequence的数据库,如Oracle。lincrement:主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。lidentity:采用数据库提供的主键生成机制,如SQLServer、MySQL中的自增主键生成机制。lsequence:采用数据库提供的sequence机制生成主键,如Oracle

18、sequence。luuid.hex:由Hibernate基于128位唯一值产生算法,根据当前设备IP、时间、JVM启动时间、内部自增量等4个参数生成十六进制数值(编码后长度为32位的字符串表示)作为主键。即使是在多实例并发运行的情况下,这种算法在最大程度上保证了产生id的唯一性。当然,重复的概率在理论上依然存在,只是概率比较小。luuid.string:与uuid.hex类似,只是对生成的主键进行编码(长度16位)。lforeign:使用外部表的字段作为主键。lselect:Hibernate3新引入的主键生成机制,主要针对遗留系统的改造工程。谓浦感赶射服碧屯谢燎俞败砰镑拦块渣宽薯旬噪墓锯祥

19、舵沟综花击笔没撑第4章Hibernate应用第4章Hibernate应用4.2.2 Hibernate各种文件的作用各种文件的作用(3)属性、字段映射配置属性、字段映射将映射类属性与库表字段相关联。name=kcm指定映像类中的属性名为“kcm”,此属性将被映像到指定的库表字段KCM。type=java.lang.String指定映像字段的数据类型。columnname=KCM指定类的kcm属性映射KCB表中的KCM字段。饺肠橱玄两猫剁厚指梧悲胃探沛吓售汰扎孺朔远镶冻杂时露徘静深娟卡弗第4章Hibernate应用第4章Hibernate应用4.2.2 Hibernate各种文件的作用各种文件的

20、作用2. hibernate.cfg.xml文件文件该文件是Hibernate重要的配置文件,配置该文件主要是配置SessionFractory类。其主要代码及解释。3. HibernateSessionFactoryHibernateSessionFactory类是自定义的SessionFactory,名字可以根据自己的喜好来决定。这里用的是HibernateSessionFactory,其内容及解释。在Hibernate中,Session负责完成对象持久化操作。该文件负责创建Session对象,以及关闭Session对象。从该文件可以看出,Session对象的创建大致需要以下3个步骤:初始

21、化Hibernate配置管理类Configuration。通过Configuration类实例创建Session的工厂类SessionFactory。通过SessionFactory得到Session实例。审郡丫苟蒲坞卡逞傀驰匀臣五混况扬板不恤汤辗恕手兄宛壳渍档熄邯吧演第4章Hibernate应用第4章Hibernate应用4.2.3 Hibernate核心接口核心接口1. Configuration接口接口Configuration负责管理Hibernate的配置信息。Hibernate运行时需要一些底层实现的基本信息。这些信息包括:数据库URL、数据库用户名、数据库用户密码、数据库JDBC

22、驱动类、数据库dialect。用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现,如Hibernate数据库类型到特定数据库数据类型的映射等。使用Hibernate必须首先提供这些基础信息以完成初始化工作,为后续操作做好准备。这些属性在Hibernate配置文件hibernate.cfg.xml中加以设定,当调用:Configurationconfig=newConfiguration().configure();时,Hibernate会自动在目录下搜索hibernate.cfg.xml文件,并将其读取到内存中作为后续操作的基础配置。索无绊讼荤肃通纱藻苍纳咽秋逆荣夹坤藉习坯吊锤运骡力

23、芳炯蹈忱膊贱裔第4章Hibernate应用第4章Hibernate应用4.2.3 Hibernate核心接口核心接口2. SessionFactory接口接口SessionFactory负责创建Session实例,可以通过Configuration实例构建SessionFactory。Configurationconfig=newConfiguration().configure();SessionFactorysessionFactory=config.buildSessionFactory();Configuration实例config会根据当前的数据库配置信息,构造SessionFaco

24、ry实例并返回。SessionFactory一旦构造完毕,即被赋予特定的配置信息。也就是说,之后config的任何变更将不会影响到已经创建的SessionFactory实例sessionFactory。如果需要使用基于变更后的config实例的SessionFactory,需要从config重新构建一个SessionFactory实例。SessionFactory保存了对应当前数据库配置的所有映射关系,同时也负责维护当前的二级数据缓存和StatementPool。由此可见,SessionFactory的创建过程非常复杂、代价高昂。这也意味着,在系统设计中充分考虑到SessionFactory的

25、重用策略。由于SessionFactory采用了线程安全的设计,可由多个线程并发调用。涟汇析犁矾磊钾怒眷徽愧但渊伤绰炔笔墟疯找噬创友招绪研示喝鞍朽机身第4章Hibernate应用第4章Hibernate应用4.2.3 Hibernate核心接口核心接口3. Session接口接口Session是Hibernate持久化操作的基础,提供了众多持久化方法,如save、update、delete等。通过这些方法,透明地完成对象的增加、删除、修改、查找等操作。同时,值得注意的是,HibernateSession的设计是非线程安全的,即一个Session实例同时只可由一个线程使用。同一个Session实

26、例的多线程并发调用将导致难以预知的错误。Session实例由SessionFactory构建:Configurationconfig=newConfiguration().configure();SessionFactorysessionFactory=config.buldSessionFactory();Sessionsession=sessionFactory.openSession();4. Transaction接口接口Transaction是Hibernate中进行事务操作的接口,Transaction接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA中的UserT

27、ransaction,甚至可以是CORBA事务。之所以这样设计是可以让开发者能够使用一个统一的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移值。事务对象通过Session创建。例如以下语句:Transactionts=session.beginTransaction();糯球详仲议札御钙淡杀弄陪放獭止光辖梳诈停侄属阑抹智飘继皇蓑伺产韶第4章Hibernate应用第4章Hibernate应用4.2.3 Hibernate核心接口核心接口5. Query接口接口在Hibernate2.x中,find()方法用于执行HQL语句。Hibernate3.x废除了find()方法,取而代之的是

28、Query接口,它们都用于执行HQL语句。Query和HQL是分不开的。Queryquery=session.createQuery(“fromKcbwherekch=198”);例如以下语句:Queryquery=session.createQuery(fromKcbwherekch=?);就要在后面设置其值:Query.setString(0,要设置的值);上面的方法是通过“?”来设置参数,还可以用“:”后跟变量的方法来设置参数,如上例可以改为:Queryquery=session.createQuery(fromKcbwherekch=:kchValue);Query.setString

29、(kchValue,要设置的课程号值);其使用方法是相同的,例如:Query.setParameter(0,要设置的值);Query还有一个list()方法,用于取得一个List集合的示例,此示例中包括可能是一个Object集合,也可能是Object数组集合。例如:Queryquery=session.createQuery(fromKcbwherekch=198);Listlist=query.list();拇坟挥陇累妇凛剪臆苍太烤钡唉懒症铅敬厨腥昭歪狐祝齐纳营忧畜痞牌搔第4章Hibernate应用第4章Hibernate应用4.2.4 HQL查询查询下面介绍HQL的几种常用的查询方式。1.

30、 基本查询基本查询基本查询是HQL中最简单的一种查询方式。下面以课程信息为例说明其几种查询情况。(1)查询所有课程信息Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();Queryquery=session.createQuery(fromKcb);Listlist=query.list();mit();HibernateSessionFactory.closeSession();食团华轩衍瘸俱拨更觅岩滴氟看剧佑亦唉官瓮自裙绵鲍醒颜预汞哺咐特迁第4章Hibern

31、ate应用第4章Hibernate应用4.2.4 HQL查询查询(2)查询某门课程信息.Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();/查询一门学时最长的课程Queryquery=session.createQuery(fromKcborderbyxsdesc);query.setMaxResults(1);/设置最大检索数目为1/装载单个对象Kcbkc=(Kcb)query.uniqueResult();mit();HibernateSessionFac

32、tory.closeSession();.艇姐獭雄涪雀则淄曰筐岳蕊榴坐壳纹紫娜嚼理说锦例钩轰辽峰非料吼帮轨第4章Hibernate应用第4章Hibernate应用4.2.4 HQL查询查询(3)查询满足条件的课程信息.Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();/查询课程号为001的课程信息Queryquery=session.createQuery(fromKcbwherekch=001);Listlist=query.list();mit();Hib

33、ernateSessionFactory.closeSession();.勾浩局抵邑夺揍浪呻踢拙负姜醉仓像仔实惋砚岂瀑葡冷愁傅凑婿褒哺羌媒第4章Hibernate应用第4章Hibernate应用4.2.4 HQL查询查询2. 条件查询条件查询查询的条件有几种情况,下面举例说明。(1)按指定参数查询.Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();/查询课程名为计算机基础的课程信息Queryquery=session.createQuery(fromKcbwh

34、erekcm=?);query.setParameter(0,计算机基础);Listlist=query.list();mit();HibernateSessionFactory.closeSession();.辖颂吵屉眨超腺损斯胃局蜕替哥腺椿靖泻销婶慈哗骡灯淮凭母值乒卫作袄第4章Hibernate应用第4章Hibernate应用4.2.4 HQL查询查询(2)使用范围运算查询.Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();/查询这样的课程信息,课程名为计

35、算机基础或数据结构,且学时在4060之间Queryquery=session.createQuery(fromKcbwhere(xsbetween40and60)andkcmin(计算机基础,数据结构);Listlist=query.list();mit();HibernateSessionFactory.closeSession();.灶我先辨若跌晦症软林彪潍回逃方原砾份遮润俄溯矗睁绘捅乃滑厕勾萄趴第4章Hibernate应用第4章Hibernate应用4.2.4 HQL查询查询(3)使用比较运算符查询.Sessionsession=HibernateSessionFactory.getSe

36、ssion();Transactionts=session.beginTransaction();/查询学时大于51且课程名不为空的课程信息Queryquery=session.createQuery(fromKcbwherexs51andkcmisnotnull);Listlist=query.list();mit();HibernateSessionFactory.closeSession();.住帕驴除钢婪传昂熟顾棋鳃师腔壳掇耗诗淖咙淑助饱苞竖捧憨喂孔饲晚入第4章Hibernate应用第4章Hibernate应用4.2.4 HQL查询查询(4)使用字符串匹配运算查询.Sessionses

37、sion=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();/查询课程号中包含“001”字符串且课程名前面三个字为计算机的所有课程信息Queryquery=session.createQuery(fromKcbwherekchlike%001%andkcmlike计算机%);Listlist=query.list();mit();HibernateSessionFactory.closeSession();.犁皱迈唯竟许芜再臂缮夜堪绕跳樱桂当偶臣描诽拧基匿施粳繁窄快处娥妨第4章Hibern

38、ate应用第4章Hibernate应用4.2.4 HQL查询查询3. 分页查询分页查询为了满足分页查询的需要,Hibernate的Query实例提供了两个有用的方法:setFirstResult(intfirstResult)和setMaxResults(intmaxResult)。其中setFirstResult(intfirstResult)方法用于指定从哪一个对象开始查询(序号从0开始),默认为第1个对象,也就是序号0。SetMaxResults(intmaxResult)方法用于指定一次最多查询出的对象的数目,默认为所有对象。如下面的代码片段:.Sessionsession=Hiber

39、nateSessionFactory.getSession();Transactionts=session.beginTransaction();Queryquery=session.createQuery(fromKcb);intpageNow=1;/想要显示第几页intpageSize=5;/每页显示的条数query.setFirstResult(pageNow-1)*pageSize);/指定从哪一个对象开始查询query.setMaxResults(pageSize);/指定最大的对象数目Listlist=query.list();mit();HibernateSessionFacto

40、ry.closeSession();.丙首蒂蔫凋蛊兔余印弘诗墅骨院飞橇翰捉壶千期捉沼愧陨栋瞧锁笺戒烁氢第4章Hibernate应用第4章Hibernate应用4.3 Hibernate关系映射关系映射4.3.1 一对一关联一对一关联1. 共享主键方式共享主键方式在注册某个论坛会员的时候,往往不但要填写登录账号和密码,还要填写其他的详细信息,这两部分信息通常会放在不同的表中,如表4.1、表4.2所示。字 段 名 称数 据 类 型主 键自 增允 许 为 空描 述IDint(4)是ID号USERNAMEvarchar(20)登录账号PASSWORDvarchar(20)登录密码字 段 名 称数 据

41、类 型主 键自 增允 许 为 空描 述IDint(4)是增1ID号TRUENAMEvarchar(8)是真实姓名EMAILvarchar(50)是电子邮件表4.1登录表Login表4.2详细信息表Detail货涤空利啦攻蠢便遵炬喝误磨罢球烤被饱莉让按吻遁宣塑剃燥硫蹈崩篷驹第4章Hibernate应用第4章Hibernate应用4.3.1 一对一关联一对一关联登录表和详细信息表属于典型的一对一关联关系,可按共享主键方式进行。步骤如下:创建Java项目,命名为“Hibernate_mapping”。添加Hibernate开发能力,步骤同4.2.1节第4步。HibernateSessionFacto

42、ry类同样位于org.util包下。编写生成数据库表对应的Java类对象和映射文件。Login表对应的POJO类Login.java:packageorg.model;publicclassLoginimplementsjava.io.Serializableprivateintid; /ID号privateStringusername;/登录账号privateStringpassword;/密码privateDetaildetail;/详细信息/省略上述各属性的getter和setter方法霄帮箭辑积苔柿恬攻欲蒂啦寻辕谢邪汛雀塞殊截啮茨鸽挪诚啄砍蔑篆钞件第4章Hibernate应用第4章Hi

43、bernate应用4.3.1 一对一关联一对一关联Detail表对应的Detail.java:packageorg.model;publicclassDetailimplementsjava.io.Serializableprivateintid;/ID号privateStringtrueName;/真实姓名privateStringemail;/电子邮件privateLoginlogin;/登录信息/省略上述各属性的getter和setter方法Login表与Login类的ORM映射文件Login.hbm.xml。Detail表与Detail类的ORM映射文件Detail.hbm.xml:墩

44、杆吞够勘烧承餐肢奢房飞星坞紫炔恍驼剁钵猪挫物逮窝伏泥叙筷煽淌简第4章Hibernate应用第4章Hibernate应用4.3.1 一对一关联一对一关联在hibernate.cfg.xml文件中加入配置映射文件的语句。创建测试类。在src文件夹下创建包test,在该包下建立测试类,命名为“Test.java”。其代码。运行程序,测试结果。因为该程序为JavaApplication,所以可以直接运行。在完全没有操作数据库的情况下,程序就完成了对数据的插入。插入数据后,Login表和Detail表的内容如图4.12、图4.13所示。 图4.12Login表图4.13Detail表扑回窝即闭伺改数肩碧

45、睫寿条赌存拘母咕叛狗耕扎灼伞崔胞里啮厢玉进尘第4章Hibernate应用第4章Hibernate应用4.3.1 一对一关联一对一关联2. 唯一外键方式唯一外键方式唯一外键的情况很多,例如,每个人对应一个房间。其实在很多情况下,可以是几个人住在同一个房间里面,就是多对一的关系。但是如果把这个多变成唯一,也就是说让一个人住一个房间,就变成了一对一的关系了,这就是前面说的一对一的关系其实是多对一关联关系的一种特殊情况。对应的Person表和Room表如表4.3、表4.4所示。字 段 名 称数 据 类 型主 键自 增允 许 为 空描 述Idint是增1ID号namevarchar(20)姓名room_

46、idint(20)是房间号字 段 名 称数 据 类 型主 键自 增允 许 为 空描 述idint(4)是增1ID号addressvarchar(100)地址表4.3Person表表4.4Room表副饮德陵碾耗豌燃喊核膛脆屠尿赡雍亿戊胚溢苟邻黔法藏潜受琼泊轨阎淡第4章Hibernate应用第4章Hibernate应用4.3.1 一对一关联一对一关联步骤如下:在项目Hibernate_mapping的org.model包下编写生成数据库表对应的Java类对象和映射文件。Person表对应的POJO类Person.java:packageorg.model;publicclassPersonimpl

47、ementsjava.io.SerializableprivateIntegerid;privateStringname;privateRoomroom;/省略上述各属性的getter和setter方法Room表对应的POJO类Room.java:packageorg.model;publicclassRoomimplementsjava.io.Serializableprivateintid;privateStringaddress;privatePersonperson;/省略上述各属性的getter和setter方法育默猪唾夹刮障池端夕箱欠谤屠力赞尘藤搔锤瑶野廓易摧逝惟奖亢储城斗第4章H

48、ibernate应用第4章Hibernate应用4.3.1 一对一关联一对一关联Person表与Person类的ORM映射文件Person.hbm.xml:/唯一性约束,实现一对一侵儡舷蜘皆鸽焉仰帛鸽酪誉钟该摘飞熊秋谭羡苏捕以贱脸征纺薛饲史毁刀第4章Hibernate应用第4章Hibernate应用4.3.1 一对一关联一对一关联Room表与Room类的ORM映射文件Room.hbm.xml:/指定关联类的属性名倦状瑶革举答逻慈父早倒故幸到普建李舀偏词转曝湖洽桓埃似唱朴揽仰红第4章Hibernate应用第4章Hibernate应用4.3.1 一对一关联一对一关联在hibernate.cfg.x

49、ml文件中加入如下的配置映射文件的语句。编写测试代码。在src文件夹下的包test的Test类中加入如下代码:Personperson=newPerson();person.setName(liumin);Roomroom=newRoom();room.setAddress(NJ-S1-328);person.setRoom(room);session.save(person);海凛啸勋滴韦梯俄窄翱趴愧顽膜岁签宴椒迄阜况映丧丽举夸御壶惹鹰撵缆第4章Hibernate应用第4章Hibernate应用4.3.1 一对一关联一对一关联运行程序,测试结果。因为该程序为JavaApplication,所

50、以可以直接运行。在完全没有操作数据库的情况下,程序就完成了对数据的插入。插入数据后,Person表和Room表的内容如图4.14、图4.15所示。 图4.14Person表图4.15Room表舆氟鉴哈躁哲链库沮拴框个们券卑特醚键宜壬九歇败们背琐悼症禄卖缉昼第4章Hibernate应用第4章Hibernate应用4.3.2 多对一单向关联多对一单向关联只要把上例中的一对一的唯一外键关联实例稍微修改就可以变成多对一。步骤如下:在项目Hibernate_mapping的org.model包下编写生成数据库表对应的Java类对象和映射文件。其对应表不变,Person表对应的类也不变,对应的Person

51、.hbm.xml文件修改如下:/主控类所有操作,对关联类也执行同样操作怖调云氧案汀勃羽粘叼马掳萍闹奏垂力编恼嫩诫泽曲置口脂知桓尹沮雍约第4章Hibernate应用第4章Hibernate应用4.3.2 多对一单向关联多对一单向关联而Room表不变,对应的POJO类如下:packageorg.model;publicclassRoomimplementsjava.io.Serializableprivateintid;privateStringaddress;/省略上述各属性的getter和setter方法Room表与Room类的ORM映射文件Room.hbm.xml如下:低啤捕矫讼泥宰琴疆访牺

52、焕详杏孵艇亿瞳窥集贺劳融郊块荤吃女范够理缝第4章Hibernate应用第4章Hibernate应用4.3.2 多对一单向关联多对一单向关联编写测试代码。在src文件夹下的包test的Test类中加入如下代码:Roomroom=newRoom();room.setAddress(NJ-S1-328);Personperson=newPerson();person.setName(liuyanmin);person.setRoom(room);session.save(person);紊薪烟概绚窗祁捅裂等三拙迟债蹋退累瘫啸馒鹏豫撩锹忙仰淑逢镣阜脓熟第4章Hibernate应用第4章Hibernat

53、e应用4.3.2 多对一单向关联多对一单向关联运行程序,测试结果。因为该程序为JavaApplication,所以可以直接运行。在完全没有操作数据库的情况下,程序就完成了对数据的插入。插入数据后,Person表和Room表的内容如图4.16、图4.17所示。 图4.16Person表图4.17Room表嫁往嫡九驳渝铲愉白蔬奉线瘤屠汛客釜碗绍锅耸烟铀滔切跟俐韧舀拇绚岂第4章Hibernate应用第4章Hibernate应用4.3.3 一对多双向关联一对多双向关联下面通过修改4.3.2节的例子来完成双向多对一的实现。步骤如下:在项目Hibernate_mapping的org.model包下编写生成

54、数据库表对应的Java类对象和映射文件。Person表对应的POJO及其映射文件不用改变,现在来修改Room表对应的POJO类及其映射文件。对应的POJO类Room.java。Room表与Room类的ORM映射文件Room.hbm.xml。该配置文件中cascade配置的是级联程度,它有以下几种取值:lall:表示所有操作句在关联层级上进行连锁操作。lsave-update:表示只有save和update操作进行连锁操作。ldelete:表示只有delete操作进行连锁操作。lall-delete-orphan:在删除当前持久化对象时,它相当于delete;在保存或更新当前持久化对象时,它相当

55、于save-update。另外它还可以删除与当前持久化对象断开关联关系的其他持久化对象。衅柠珐撑戒足捉晓贩涂咨驳煤栽耽崔誉赏砧幌鲤倾膀谜恍柏环颐郊馒队豪第4章Hibernate应用第4章Hibernate应用4.3.3 一对多双向关联一对多双向关联编写测试代码。在src文件夹下的包test的Test类中加入如下代码:Personperson1=newPerson();Personperson2=newPerson();Roomroom=newRoom();room.setAddress(NJ-S1-328);person1.setName(李方方);person2.setName(王艳);pe

56、rson1.setRoom(room);person2.setRoom(room);/这样完成后就可以通过Session对象/调用session.save(person1)和session.save(person)/会自动保存roomsession.save(person1);session.save(person2);瓤引司采辗援蚜港蚊痕紫据岛缔幻俭呛斥把狱伦丧煎宁绸俄很僵值哑菲蹲第4章Hibernate应用第4章Hibernate应用4.3.3 一对多双向关联一对多双向关联运行程序,测试结果。因为该程序为JavaApplication,所以可以直接运行。在完全没有操作数据库的情况下,程序就

57、完成了对数据的插入。插入数据后,Person表和Room表的内容如图4.18、图4.19所示。 图4.18Person表图4.19Room表预谱盒雀眉度泳记萎粕秆塞铡完释夕力祷而妥滚烬瞒篙邮嗓彦酒霖筛晤洽第4章Hibernate应用第4章Hibernate应用4.3.3 一对多双向关联一对多双向关联由于是双向的,当然也可以从Room的一方来保存Person,在Test.java中加入如下代码:.Personperson1=newPerson();Personperson2=newPerson();Roomroom=newRoom();person1.setName(李方方);person2.s

58、etName(王艳);Setpersons=newHashSet();persons.add(person1);persons.add(person2);room.setAddress(NJ-S1-328);room.setPerson(persons);/这样完成后,就可以通过Session对象/调用session.save(room)/会自动保存person1和person2.莫组筏诡俐芳粉芒烯佣宴广隋炎晃腥骄寐掌埋疙娠浓疙耻锣章风踊邓忿坯第4章Hibernate应用第4章Hibernate应用4.3.3 一对多双向关联一对多双向关联运行程序,插入数据后,Person表和Room表的内容如

59、图4.20、图4.21所示。 图4.20Person表图4.21Room表烽煮诞称嗓阿磁囤膜棉碍命典幂孩试讳书蠢竖脓滨蒋上匆寨扼鹰箕腿适第第4章Hibernate应用第4章Hibernate应用4.3.4 多对多关联多对多关联1. 多对多单向关联多对多单向关联学生和课程就是多对多的关系,一个学生可以选择多门课程,而一门课程又可以被多个学生选择。多对多关系在关系数据库中不能直接实现,还必须依赖一张连接表。如表4.6、表4.7和表4.8所示。字 段 名 称数 据 类 型主 键自 增允 许 为 空描 述IDint是增1ID号SNUMBERvarchar(10)学号SNAMEvarchar(10)是姓

60、名SAGEint是年龄字 段 名 称数 据 类 型主 键自 增允 许 为 空描 述IDint是增1ID号CNUMBERvarchar(10)课程号CNAMEvarchar(20)是课程名表4.6学生表student表4.7课程表course字 段 名 称数 据 类 型主 键自 增允 许 为 空描 述SIDint是学生ID号CIDint是课程ID号表4.8连接表stu_cour就推团帽疽代池升除沛逞科匈矛确华丈膨栏五辫陷矽肘借竭云篷沉乾幽片第4章Hibernate应用第4章Hibernate应用4.3.4 多对多关联多对多关联由于是单向的,也就是说从一方可以知道另一方,反之不行。这里以从学生知道

61、选择了哪些课程为例实现多对多单向关联。步骤如下:在项目Hibernate_mapping的org.model包下编写生成数据库表对应的Java类对象和映射文件。student表对应的POJO类如下:packageorg.model;importjava.util.HashSet;importjava.util.Set;publicclassStudentimplementsjava.io.Serializableprivateintid;privateStringsnumber;privateStringsname;privateintsage;privateSetcourses=newHas

62、hSet();/省略上述各属性的getter和setter方法student表与Student类的ORM映射文件Student.hbm.xml。耿稗碴骑轨炭替审呻勿榆酚舆围受演愤梨跃烧沸联舜德蹄锚儒纲严闻跋敦第4章Hibernate应用第4章Hibernate应用4.3.4 多对多关联多对多关联course表对应的POJO如下:packageorg.model;publicclassCourseimplementsjava.io.Serializableprivateintid;privateStringcnumber;privateStringcname;/省略上述各属性的getter和se

63、tter方法。course表与Course类的ORM映射文件Course.hbm.xml。在hibernate.cfg.xml文件中加入如下的配置映射文件的语句。编写测试代码。在src文件夹下的包test的Test类中加入如下代码。爪郸剪挚洞逝珐厌湃钧跺碧领陨聘柒金帝波鳖伟掌筹梨骚邑党粮编妊忠析第4章Hibernate应用第4章Hibernate应用4.3.4 多对多关联多对多关联运行程序,测试结果。因为该程序为JavaApplication,所以可以直接运行。在完全没有操作数据库的情况下,程序就完成了对数据的插入。插入数据后,student表、course表及连接表stu_cour表的内容如

64、图4.22、图4.23、图4.24所示。图4.22student表 图4.23course表图4.24stu_cour表竖崩值忍坑庚陷口勘舷葵飘荔瞧卵讯郡同熄仙缕纲咨履弧奠秃拟旷炸鹊最第4章Hibernate应用第4章Hibernate应用4.3.4 多对多关联多对多关联2. 多对多双向关联多对多双向关联首先将其Course表所对应的POJO对象修改成如下代码:packageorg.model;importjava.util.HashSet;importjava.util.Set;publicclassCourseimplementsjava.io.Serializableprivateint

65、id;privateStringcnumber;privateStringcname;privateSetstus=newHashSet();/省略上述各属性的getter和setter方法Course表与Course类的ORM映射文件Course.hbm.xml:她擎愿芯柯炳吸耳赖此骏铆磨汪躲蟹靠浴义盲讽滥挂涨忘是丛幂锰格镍多第4章Hibernate应用第4章Hibernate应用4.4 Hibernate高级功能高级功能4.4.1 Hibernate批量处理批量处理1. 批量插入批量插入(1)通过Hibernate的缓存进行批量插入使用这种方法时,首先要在Hibernate的配置文件hib

66、ernate.cfg.xml中设置批量尺寸属性hibernate.jdbc.batch_size,且最好关闭Hibernate的二级缓存以提高效率。例如:50/设置批量尺寸false/关闭二级缓存齐巧帛赤挺褐色印蠢挡逼叼压那嫩殴舒咽昭截誉师击澳频伪消砂舒庆舍冬第4章Hibernate应用第4章Hibernate应用4.4.1 Hibernate批量处理批量处理下面以4.2.1节的例子中的课程进行批量插入为例,说明批量插入操作的具体过程,这里假设批量插入500个课程到数据中:Sessionsession=HibernateSessionFactory.getSession();Transacti

67、onts=session.beginTransaction();for(inti=0;i500;i+)Kcbkcb=newKcb();/这里设置课程号为i,在实际应用中应该是被插入的课程对象/已经放在集合或数组中,这里只要取出kcb.setKch(i+);session.save(kcb);if(i%50=0)/以50个课程为一个批次向数据库提交,此值应与配置的批量尺寸一致session.flush();/将该批量数据立即插入数据库中session.clear();/清空缓存区,释放内存供下批数据使用mit();HibernateSessionFactory.closeSession();毗贼

68、惶藏滓激艇器弓呀颐免尺尾栽植言偶碍唱蛋范寿临愤菩疡喊拇羡唆仕第4章Hibernate应用第4章Hibernate应用4.4.1 Hibernate批量处理批量处理(2)绕过Hibernate直接调用JDBC进行插入由于Hibernate只是对JDBC进行了轻量级的封装,因此完全可以绕过Hibernate直接调用JDBC进行批量插入。因此上例可以改成如下代码:Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();Connectionconn=session.conn

69、ection();tryPreparedStatementstmt=conn.prepareStatement(insertintoKCB(KCH)values(?);for(inti=0;i500;i+)stmt.setString(1,i+);stmt.addBatch();/添加到批处理命令中stmt.executeBatch();/执行批处理任务catch(SQLExceptione)e.printStackTrace();mit();HibernateSessionFactory.closeSession();乾繁殴垣卞垛犯毕拱案咨烬幻想酵栏缅梢拦谗问芦酥赘督恳尤颅洗硬矛险第4章Hi

70、bernate应用第4章Hibernate应用4.4.1 Hibernate批量处理批量处理2. 批量更新批量更新(1)由Hibernate直接进行批量更新为了使Hibernate的HQL直接支持update/delete的批量更新语法,首先要在Hibernate的配置文件hibernate.cfg.xml中设置HQL/SQL查询翻译器属性hibernate.query.factory_class。org.hibernate.hql.ast.ASTQueryTranslatorFactory减杆妊滁川脑椎诲啃嗓丑鲸盒纬倔淋术想疽兽溉漓憎翟园悬苗率努帆昔榷第4章Hibernate应用第4章Hib

71、ernate应用4.4.1 Hibernate批量处理批量处理下面使用HQL批量更新把课程表中的XS修改为30。由于这里是用Hibernate操作,故HQL要用类对象及其属性。Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();/在HQL查询中使用update进行批量更新Queryquery=session.createQuery(updateKcbsetxs=30);query.executeUpdate();mit();HibernateSessionFac

72、tory.closeSession();黍萤料攫腰朽抡读境捍菜钓谅悍皆涌谐钉宝瓷销狄侦作诛握扰冻忘狮弓慕第4章Hibernate应用第4章Hibernate应用4.4.1 Hibernate批量处理批量处理(2)绕过Hibernate调用JDBC进行批量更新由于这里是直接操作数据库,故要操作对应表,而不是类。Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();Connectionconn=session.connection();tryStatementstmt

73、=conn.createStatement();/调用JDBC的update进行批量更新stmt.executeUpdate(updateKCBsetXS=30);catch(SQLExceptione)e.printStackTrace();mit();HibernateSessionFactory.closeSession();蚕夜垃技仇垃节棕净貉侠倘柄鸡坤愤骂律珍骑奶麻驻椰祝帖隐腻仙顾懈鹰第4章Hibernate应用第4章Hibernate应用4.4.1 Hibernate批量处理批量处理3. 批量删除批量删除(1)由Hibernate直接进行批量删除与批量更新一样,为了使Hiberna

74、te的HQL直接支持update/delete的批量删除语法,首先要在Hibernate的配置文件hibernate.cfg.xml中设置HQL/SQL查询翻译器属性hibernate.query.factory_class。org.hibernate.hql.ast.ASTQueryTranslatorFactory舒氏墩诉躺拙银痢巢裁级刑戒裳毛昂迫捶灸稚茎谷鞍因椎拒芬蜕沾妒园顿第4章Hibernate应用第4章Hibernate应用4.4.1 Hibernate批量处理批量处理下面将使用HQL批量删除课程表中课程号大于200的课程。Sessionsession=HibernateSessi

75、onFactory.getSession();Transactionts=session.beginTransaction();/在HQL查询中使用delete进行批量删除Queryquery=session.createQuery(deleteKcbwherekch200);query.executeUpdate();mit();HibernateSessionFactory.closeSession();冷问谐摄杠昂酌掳议墓团长肃集敢某虞盎可膘寝烙乃掠巍钳肾遥儒彤游拟第4章Hibernate应用第4章Hibernate应用4.4.1 Hibernate批量处理批量处理(2)绕过Hibern

76、ate调用JDBC进行批量删除同样删除课程表中课程号大于200的课程。Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();Connectionconn=session.connection();tryStatementstmt=conn.createStatement();/调用JDBC的delete进行批量删除stmt.executeUpdate(deletefromKCBwhereKCH200);catch(SQLExceptione)/TODOAuto-g

77、eneratedcatchblocke.printStackTrace();mit();HibernateSessionFactory.closeSession();错览勘稳啼施衷鸥归莱章汽淆蔬琐垣朵棱搏蹲拱流硅钵赶垣辰舞荷排莫晚第4章Hibernate应用第4章Hibernate应用4.4.2 实体对象生命周期实体对象生命周期实体对象的生命周期有以下3种状态。1transient(瞬时态)(瞬时态)瞬时态,即实体对象在内存中的存在,与数据库中的记录无关。如下面的代码:Studentstu=newStudent();stu.setSnumber(081101);stu.setSname(李方方

78、);stu.setSage(21);2persisent(持久态)(持久态)在这种状态下,实体对象的引用被纳入Hibernate实体容器中加以管理。处于持久状态的对象,其变更将由Hibernate固化到数据库中。例如下面的代码。姓崭殿帆阮珠哲亭肇虏阻别洲邻脐帛鳞脆鸯漳检母军衍绦瞒稍小农晃孔蓬第4章Hibernate应用第4章Hibernate应用4.4.2 实体对象生命周期实体对象生命周期3Detached(脱管状态)(脱管状态)处于持久态的对象,其对应的Session实例关闭之后,此对象就处于脱管状态。Session实例可以看做是持久对象的宿主,一旦此宿主失效,其从属的持久对象进入脱管状态。

79、如下面的代码:/stu处于瞬时态Studentstu=newStudent();Studentstu1=newStudent();stu.setSnumber(081101);stu.setSname(李方方);stu.setSage(21);stu1.setSnumber(081102);stu1.setSname(程明);stu1.setSage(22);Transactiontx=session.beginTransaction();/stu对象由Hibernate纳入管理容器,处于持久状态session.save(stu);mit();/stu对象状态为脱管态,因为与其关联的sessi

80、on已经关闭session.close();戊浇磨腑施映魂摸许驭籍捏歇垫乃揍横谜捎催季涸售嚏羌手饰内惶萌蕴瘸第4章Hibernate应用第4章Hibernate应用4.4.3 Hibernate事务管理事务管理1基于基于JDBC的事务管理的事务管理Hibernate是JDBC的轻量级封装,本身并不具备事务管理能力。在事务管理层,Hibernate将其委托给底层的JDBC或JTA,以实现事务管理和调度功能。在JDBC的数据库操作中,一项事务是由一条或多条表达式组成的不可分割的工作单元,通过提交commit()或回滚rollback()来结束事务的操作。将事务管理委托给JDBC进行处理是最简单的实

81、现方式,Hibernate对于JDBC事务的封装也比较简单。如下面的代码:Sessionsession=sessionFactory.openSession();Transactiontx=session.beginTransaction();session.save(room);mit();从JDBC层面而言,上面的代码实际上对应着:Connectioncn=getConnection;cn.setAutoCommit(false);/JDBC调用相关的SQL语句mit();朝遮基净谭巍狱覆科刀仙查肤喊扁物帅卵双罗漳疑滔途菇毙计肋窗僚什埂第4章Hibernate应用第4章Hibernate应

82、用4.4.3 Hibernate事务管理事务管理下面的代码不会对数据库产生任何效果:sessionsession=session.Factory.openSession();session.save(room);session.close();如果要使代码真正作用到数据库,必须显示地调用Transaction指令:Sessionsession=sessionFactory.openSession();Transactiontx=sessio.beginTransaction();session.save(room);mit();session.close();明检你暮障蝗欺册尔藻矢募孰酪帅足雕

83、针拂嫌翔穷待赐寸广貉椒愧典积邱第4章Hibernate应用第4章Hibernate应用4.4.3 Hibernate事务管理事务管理2基于基于JTA的事务管理概念的事务管理概念JTA(JavaTransactionAPI)是由JavaEETransactionManager去管理的事务。其最大的特点是调用UserTransaction接口的begin、commit和rollback方法来完成事务范围的界定、事务的提交和回滚。JTA可以实现统一事务对应不同的数据库。JTA主要用于分布式的多个数据源的两阶段提交的事务,而JDBC的Connection提供单个数据源的事务。后者因为只涉及一个数据源,

84、所以其事务可以由数据库自己单独实现。而JTA事务因为其分布式和多数据源的特性,不可能由任何一个数据源实现事务。因此,JTA中的事务是由“事务管理器”实现的。它会在多个数据源之间统筹事务,具体使用的技术就是所谓的“两阶段提交”。3锁锁业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算处理中,希望对某个结算时间点的数据进行处理,而不希望在结算过程中(可能是几秒,也可能是几个小时),数据再发生变化。此时,需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制就是所谓的“锁”,即给选定的目标数据上锁,使其无法被其他程序修改。Hibernate支持两种锁机制,悲

85、观锁(PessimisticLocking)和乐观锁(OptimisticLocking)。脑烩斯姆赌挣殊粪锁砾鸦泌你堪惜鬼蜂颊饲橡过鹏鞘沏烟泵戚暗侧俘伊陋第4章Hibernate应用第4章Hibernate应用4.5 Hibernate与与Struts 2整合应用整合应用4.5.1 DAO模式模式DAO是DataAccessObject数据访问接口,既然是对数据的访问,顾名思义就是与数据库打交道。为了建立一个健壮的JavaEE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,

86、当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储,这就是DAO模式。惮帖扣缀抵笋拓抱掂骄斌褂拴茫疙遵纳吞藤酱苗哈瞻峦色巡爱补也杭蝶簿第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统该系统就是为了实现这样一些功能,学生登录系统后,可以查看、修改个人信息,查看个人选课情况,选定课程及退选课程。其登录界面如图4.25所示。图4.25登录界面庆骄炎揭浆鸭筛且龋开蛛幽肯怯饯逞琐喇寻圈尉阳奸熔擎湿躯届扎章组方第4章Hibernate应

87、用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统登录成功后进入主界面,如图4.26所示。图4.26主界面笨孺阉颂揽竭铡操欲召军斟瀑贵负阐从妖扼袭泊烁柔姻永芒邑乍框斗胳弓第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统单击【查询个人信息】超链接,可以查看当前用户的个人信息,如图4.27所示。图4.27查询个人信息界面耗徘定痢缝暖会呆涂罪膝秤情墙淘愿种锥凳挽酝薛标镶位敏新匠弧衅铆卉第4章Hibern

88、ate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统单击【个人选课情况】超链接,可以列举出当前用户的个人选课情况,如图4.28所示。图4.28个人选课情况界面咏蜂笋徒遣捉袱妙遵湃玻鳞鸽汁衫缄洞锋迁蚌挪价浚追宁雷求岂艺悯于使第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统单击表格右边的【退选】超链接就可退选该课程。单击【所有课程信息】超链接,可显示所有课程的信息,如图4.29所示。图4.29所

89、有课程信息界面页怠溢辊榆芋晚钩袖溶枣芳煽樱仟镑磨伪尹块我他走单技潮埃江梆居页茧第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统1. 建立数据库及表结构建立数据库及表结构根据上面所述功能,该系统需要建立登录表、学生表、专业表、课程表,以及学生课程表即连接表。2在在MyEclipse中创建对中创建对SQL Server 的连接的连接步骤见4.2.1节的第2步。3创建创建Web项目项目打开MyEclipse,创建Web项目,命名为“Struts_Hibernate”。4. 添加添加Hib

90、ernate开发能力开发能力步骤见4.2.1节的第4步。5. 生成数据库表对应的生成数据库表对应的Java类对象和映射文件类对象和映射文件下面列举需要修改的代码),修改后的代码如下。塞踞钵斤斤遗驳践凤碳帮韵僳叮瑞灾隔剑绞锥指寻尔畴派剑芒侮彬浊越雇第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统Xsb.java代码如下:packageorg.model;importjava.util.Date;importjava.util.HashSet;importjava.util.Set;p

91、ublicclassXsbimplementsjava.io.SerializableprivateStringxh;privateZybzyb;privateStringxm;privateBytexb;privateDatecssj;privateIntegerzxf;privateStringbz;privatebytezp;privateSetkcs=newHashSet();/省略上述各属性的getter和setter方法Xsb.hbm.xml文件代码。占矾一晴淹介卒芥琶冒捏吵粗滋抡竭懊跪削展奄发塔霞鸥釉笑枝庚苯极换第4章Hibernate应用第4章Hibernate应用4.5.2

92、Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统Kcb.java代码如下:packageorg.model;importjava.util.HashSet;importjava.util.Set;publicclassKcbimplementsjava.io.SerializableprivateStringkch;privateStringkcm;privateShortkxxq;privateintxs;privateintxf;privateSetxss=newHashSet();/省略上述各属性的setter和getter方法Kcb.hbm

93、.xml代码。类及映射文件修改完成后要在hibernated.cfg.xml文件中进行注册,代码修改。颠乌奶舟炼荐栓默吾沾岁漾勘熟盂真减尧共围还簇艇粳脉袍定攘徐噶携晚第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统6. Dao层组件实现层组件实现下面是这几个实体类的Dao层组件的实现。首先要建立它们的接口Dao。DlDao.java接口代码如下:packageorg.dao;importorg.model.Dlb;publicinterfaceDlDao/根据学号和密码查询publ

94、icDlbvalidate(Stringxh,Stringkl);对应实现类DlDaoImp.java代码。XsDao.java接口代码如下:packageorg.dao;importjava.util.List;importorg.model.Xsb;publicinterfaceXsDao/根据学号查询学生信息publicXsbgetOneXs(Stringxh);/修改学生信息publicvoidupdate(Xsbxs);蛔入赶迂泽匀烁咐杏烬晨堑灰肥秩涵募集抡札谤毯恫手求藕谚帖芭泥凰认第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts

95、 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统对应实现类XsDaoImp.java代码。ZyDao.java接口代码如下:packageorg.dao;importjava.util.List;importorg.model.Zyb;publicinterfaceZyDao/根据专业ID查询专业信息publicZybgetOneZy(IntegerzyId);/查询所有专业信息publicListgetAll();对应实现类ZyDaoImp.java代码。汝阅咋腋攘织冉搏役药誉艰锹定卜酥即誓患裳盎饰现解脚燕怯熔卯凶噪纺第4章Hibernate应用第4章Hibernate应用4.5

96、.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统KcDao.java接口代码如下:packageorg.dao;importjava.util.List;importorg.model.Kcb;publicinterfaceKcDaopublicKcbgetOneKc(Stringkch);publicListgetAll();对应实现类KcDaoImp.java代码。势亚舌阎拙迟筋帧疤瓦馈蛛扦原氓鹊澈衅网鞭乒斯隆晦鹅扑币洲坤汹吴躇第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应

97、用整合应用实例实例开发学生选课系统开发学生选课系统7. 添加添加Struts 2的类库及编写的类库及编写struts.xml文件文件把Struts2所需要的5个Jar包复制到项目的WEB-INF/lib文件夹下。因为在添加学生信息中用到了照片上传,所以这里要把common-upload.jar、commin-io.jar也复制到项目的WEB-IFN/lib文件夹下。在项目的src文件夹下建立文件struts.xml。内容修改如下:/这里以后添加Action配置,后面配置的Action都要添加在这里舔抹子酣扩串笺截胃轴冒墩话肘词玉疯咆贸寿畔柄李句潭岩推抡他项钦贮第4章Hibernate应用第4章

98、Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统8. 修改修改web.xml文件文件修改web.xml文件,代码如下:login.jspstruts2org.apache.struts2.dispatcher.FilterDispatcherstruts2/*父衷舵痴敲谍档堤泄遵敲措积右里作纽捅异披祷漳雇廖丫袄痞匡当翰阎电第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统9. 功能实现功能实现首先看登录界

99、面login.jsp。从JSP文件中可以看出,该表单提交给login.action,所以在struts.xml中的Action配置如下:/main.jsp/成功后去主界面/login.jsp/失败回到login.jspLoginAction.java就要应运而生了。代码。颈璃蔓娶踏谓伶蓬迫霜羞牢琐贬怕凑党哀泵膀烃纫花琅缮缮谣糟嘻吭憎旅第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统mian.jsp是由head.jsp、left.jsp及rigth.jsp组合而成,所以它们的代码如下

100、。head.jsp:left.jsp:查询个人信息修改个人信息个人选课情况所有课程信息缘斗屯喜李款斌纲霓搏提拴壕户咨蛛殴圈员拾伤饱湿术侮惫衣煞脓秩蜂根第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统right.jsp:main.jsp:学生选课系统屹魂寒死罪霉受涟善汲棱员让娘阜左龚乏恤哨充糊幽泅伸祥竣疟双饿神电第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统进入主界面后

101、,接下来是查看个人信息的实现。从left.jsp中可以发现,其提交给xsInfo.jsp,对应Action配置如下:/xsInfo.jsp由于学生的信息中有照片信息,这里的处理思路是把要处理照片的信息提交给Action类来读取,所以这里要加入getImage的Action。XsAction.java的代码。成功后跳转的页面xsInfo.jsp。诱敝屡剧武粹砾级钨盖碌哦啤库啼椎且晨劲路粒搬燥捂续担输会膘八斑宝第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统下面介绍修改学生信息。单击【

102、修改学生信息】超链接,首先要跳转到修改学生信息的界面,供学生自己修改,但是学号是不能被修改的,专业必须是选择,而不是自己填写。从left.jsp中可以看出提交给了updateXsInfo.action,所以Action的配置为:/updateXsInfo.jsp所以就要在XsAction类中加入下面的方法。修改页面updateXsInfo.jsp的代码。腕呆引隅蝶稚葛间馆与曲球蛊辉阿归柞栅万宇材俞宛虏眉该戏玛环仕丝铜第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统当单击【修改】按钮

103、后,就把学生自己填写的内容提交给了updateXs.action,对应Action的配置如下:/updateXs_success.jspXsAction类中要加入下面的代码来处理请求。修改成功后跳转到updateXs_success.jsp页面,代码如下:恭喜你,修改成功!统梁踊茁桅痛初磁斋蹭序族掳拖溉靛涉赵莱淮伙儒暮唐垂淖海津膏襄判读第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统下面是Action配置代码:/xsKcs.jsp对应的XsAction类中的处理方法代码如下:/得到

104、学生选修的课程publicStringgetXsKcs()throwsExceptionMapsession=(Map)ActionContext.getContext().getSession();Dlbuser=(Dlb)session.get(user);Stringxh=user.getXh();/得到当前学生的信息Xsbxsb=newXsDaoImp().getOneXs(xh);/取出选修的课程SetSetlist=xsb.getKcs();Maprequest=(Map)ActionContext.getContext().get(request);/保存request.put(

105、list,list);returnSUCCESS;查询成功后的xsKcs.jsp页面代码。浴评肿租旭傈汗捍吕窥诱沦括芥乐孰使行棠劣浑吻嚷塞镭捍荡撩披泽苟几第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统退选课程,只要把该学生的这个课程从Set中remove掉就行了。对应的Action配置如下:/deleteKc_success.jsp对应XsAction类中的处理方法。退选课程成功界面deleteKc_success.jsp:退选成功!在left.jsp中还有一个链接就是查询所有课

106、程的,其实查询出所有课程也是为了让学生选课的,其Action配置如下:/allKc.jsp粉肌妈抹语湿惜爪履巾惶释惺昼伦沪乱羹操妮吵技爬翘竹荔孕皱诛发翔染第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统对应Action实现类,可以发现是一个新的Action类名为KcAction.java,代码如下:packageorg.action;importjava.util.List;importjava.util.Map;importorg.dao.KcDao;importorg.dao.

107、imp.KcDaoImp;importcom.opensymphony.xwork2.ActionContext;importcom.opensymphony.xwork2.ActionSupport;publicclassKcActionextendsActionSupportpublicStringexecute()throwsExceptionKcDaokcDao=newKcDaoImp();Listlist=kcDao.getAll();Maprequest=(Map)ActionContext.getContext().get(request);request.put(list,li

108、st);returnSUCCESS;炮晒选膀裔桐的胀已腺度尔葡钡牢依恰枉炭塞延暗向亲渝逗注淡锣寺株履第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统成功页面allKc.jsp。在每个课程的后面有【选修】超链接,提交给selectKc.action,Action的配置如下:/selectKc_success.jsp/selectKc_fail.jsp对应Action实现类的方法(由于是学生选课,所以该方法在XsAction中)。哑漠散斡皂诬砾封运监阶菊亿拢裙爪槽磕绞蒸舟景貉萄摸裂码哺柄虎沛暂第4章Hibernate应用第4章Hibernate应用4.5.2 Hibernate与与Struts 2整合应用整合应用实例实例开发学生选课系统开发学生选课系统成功页面selectKc_success.jsp:你已经成功选择该课程!失败页面selectKc_fail.jsp:你已经选择该课程,请不要重复选取!10. 部署运行部署运行完成以后,部署项目,启动Tomcat,就可以运行项目。一个简易的学生选课系统就形成了。嗅齐旗就氖蹄覆剂御袍形然骗狡而降啼局主轴甥埃擦瘪束蹿讣芽郴谷满甲第4章Hibernate应用第4章Hibernate应用

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号