第9章Hibernate的映射机制(精品).ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《第9章Hibernate的映射机制(精品).ppt》由会员分享,可在线阅读,更多相关《第9章Hibernate的映射机制(精品).ppt(69页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java EE实用教程第第9章章 Hibernate的映射机制的映射机制9.1 主键映射主键映射9.2 Hibernate的映射类型的映射类型9.3 对象关系映射对象关系映射9.4 动态类的使用动态类的使用Java EE实用教程9.1 主键映射主键映射数据库表要具有实体完整性。也就是说,基本上每个表都会有自己的主键来唯一标识自己,但每个表的主键设置方式还不尽相同,大体上主键的设置可以有以下两种区分方法。第一种区分方法:单个主键:由表的单个字段组成。复合主键:由表的多个字段共同组成。而第二种区分方法:自然主键:具有业务意义的字段作为主键,例如学生表中用XH(学号)作为主键。代理主键:定义的、专门
2、用来标识记录的id,它除了用来标识记录外,不具有任何的业务实体意义。但不管是什么主键,它都必须满足以下几个条件:主键不能为空。主键不能重复。主键不能被修改。Java EE实用教程9.1.1 代理主键的映射代理主键的映射前面已经讲过,代理主键是自定义的、用来标识表记录的,不具有任何的业务实体意义,一般表中加入一个id字段来标识。例如前面的例子中POJO类表示为:publicclassUserprivateintid;publicintgetId()returnid;publicvoidsetId(intid)this.id=id;对应的映射文件配置为:Java EE实用教程9.1.1 代理主键的
3、映射代理主键的映射下面列举这些生成器,并简单介绍它们的应用方法。assigned:应用程序自身对id赋值。当设置时,应用程序自身需要负责主键id的赋值,一般应用在主键为自然主键时。例如XH为主键时,当添加一个学生信息时,就需要程序员自己设置学号的值,这时就需要应用该id生成器。native:由数据库对id赋值。当设置时,数据库负责主键id的赋值,最常见的是int型的自增型主键。例如,在SQLServer中建立表的id字段为identity,配置了该生成器,程序员就不用为该主键设置值,它会自动设置。hilo:通过hi/lo算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。seqhi
4、lo:与hi/lo类似,通过hi/lo算法实现的主键生成机制,只是主键历史状态保存在sequence中,适用于支持sequence的数据库,如Oracle。increment:主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一个数据库有多个实例访问,这种方式应该避免使用。Java EE实用教程9.1.1 代理主键的映射代理主键的映射identity:采用数据
5、库提供的主键生成机制,如SQLServer、MySQL中的自增主键生成机制。sequence:采用数据库提供的sequence机制生成主键,如Oraclesequence。uuid.hex:由Hibernate基于128位唯一值产生算法,根据当前设备IP、时间、JVM启动时间、内部自增量等4个参数生成十六进制数值(编码后长度为32位的字符串表示)作为主键。即使是在多实例并发运行的情况下,这种算法在最大程度上保证了产生id的唯一性。当然,重复的概率在理论上依然存在,只是概率比较小。一般而言,利用uuid.hex方式生成主键将提供最好的数据插入性能和数据平台适应性。uuid.string:与uui
6、d.hex类似,只是对生成的主键进行编码(长度为16位)。在某些数据库中可能出现问题。foreign:使用外部表的字段作为主键。该主键一般应用在表与表之间的关系上,会在后面的表对应关系上进一步讲解。select:Hibernate3新引入的主键生成机制,主要针对遗留系统的改造工程。由于常用的数据库,如SQLServer、MySQL等,都提供了易用的主键生成机制(如auto-increase字段),可以在数据库提供的主键生成机制上,采用native生成器来配置主键生成方式。Java EE实用教程9.1.2 单个自然主键的映射单个自然主键的映射自然主键虽然不提倡使用,但使用自然主键的情况还是存在的
7、,例如学生表,如果不单独指定代理主键id的话,就要用到自然主键XH(学号),POJO类编写为:publicclassXSprivateStringxh;publicStringgetXh()returnxh;publicvoidsetXh(Stringxh)this.xh=xh;/省略其他属性及get和set方法对应在映射文件中的主键配置为:Java EE实用教程9.1.3 复合自然主键的映射复合自然主键的映射h1单独定义主键类单独定义主键类单独定义主键类,即把主键的属性组成一个新的类,这个类与要映射的POJO类类似,也要生成属性的set和get方法,但是该类并不作为POJO类使用,而是作为映
8、射POJO类的一个主键属性。假设有一个成绩表,该表的结构如表9.1所示。字 段 名数据类型主 键自 增允许为空描 述XHvarchar(50)是学号KCHvarchar(50)是课程号CJint是成绩表9.1 成绩(CJ)表Java EE实用教程9.1.3 复合自然主键的映射复合自然主键的映射首先把主键封装成一个类,该类有两个要求:实现java.lang.Serializable接口。重写equals()和hashCode()方法,当验证两个Cj对象是否相等时,Hibernate会使用这里的equals()方法进行判断,即判断两个对象的xh和kch是否相等。Java EE实用教程9.1.3 复
9、合自然主键的映射复合自然主键的映射然后在真正的映射POJO中使用:packageorg.vo;publicclassCjimplementsjava.io.Serializableprivate CjId id;privateintcj;public CjId getId()return id;public void setId(CjId id)this.id=id;publicintgetCj()returncj;publicvoidsetCj(intcj)this.cj=cj;Java EE实用教程9.1.3 复合自然主键的映射复合自然主键的映射POJO类编写完成后,可以编写配置文件Cj.
10、hbm.xml文件:每个映射文件都必须在Hibernate的核心文件hibernate.cfg.xml中注册才能被Hibernate框架加载:Java EE实用教程9.1.3 复合自然主键的映射复合自然主键的映射下面来看复合主键如何操作数据库数据。保存一个对象。publicvoidsaveCj()Transactionts=session.beginTransaction();/定义事务CjIdid=newCjId();/创建主键对象id.setXh(081101);/设置学号id.setKch(001);/设置课程号Cjcj=newCj();/创建POJO类对象cj.setId(id);/设
11、置主键cj.setCj(80);/设置成绩session.save(cj);/保存mit();/提交事务Java EE实用教程9.1.3 复合自然主键的映射复合自然主键的映射修改一个对象。publicvoidupdateCj()Transactionts=session.beginTransaction();CjIdid=newCjId();/创建主键对象id.setXh(081101);/设置学号id.setKch(001);/设置课程号Cjcj=(Cj)session.load(Cj.class,id);/根据主键得到对象cj.setCj(90);/重新赋值成绩session.update
12、(cj);/修改mit();/提交事务Java EE实用教程9.1.3 复合自然主键的映射复合自然主键的映射h2不单独定义主键类不单独定义主键类不单独定义主键类,就是把主键属性直接放在POJO类中,不需要单独对其进行封装,那么该POJO类就要实现java.io.Serializable接口,并重写equals()和hashCode()方法。同样,映射文件Cj.hbm.xml也略有不同:Java EE实用教程9.1.3 复合自然主键的映射复合自然主键的映射保存一个对象。publicvoidsaveCj()Transactionts=session.beginTransaction();/定义事务
13、Cjcj=newCj();/创建POJO类对象cj.setXh(081101);/设置学号cj.setKch(001);/设置课程号cj.setCj(80);/设置成绩session.save(cj);/保存mit();/提交事务Java EE实用教程9.1.3 复合自然主键的映射复合自然主键的映射修改一个对象。publicvoidupdateCj1()Transactionts=session.beginTransaction();/根据学号及课程号查询,注意这里是HQL语句,Cj是类名,xh和kch是类中属性/关于HQL会在后面讲解Queryquery=session.createQuer
14、y(fromCjwherexh=081101andkch=001);Cjcj=(Cj)query.list().get(0);/得到第一个值cj.setCj(92);/重新赋值成绩session.update(cj);/修改mit();/提交事务Java EE实用教程9.2 Hibernate的映射类型的映射类型在Hibernate的映射文件中,用标签来说明POJO类的属性与数据库表中的哪一个字段对应,并且用type属性说明对应属性应该使用什么数据类型。例如,前面的例子中User.hbm.xml并没有指定数据类型,其实也可以为其指定数据类型为:Java EE实用教程9.2 Hibernate的
15、映射类型的映射类型上面代码中的黑体部分,应用type属性来指定数据类型,那么,这个属性是Java数据类型还是数据库的数据类型呢?两者都不是。这是Hibernate的数据类型。Hibernate的数据类是Java基本数据类型与标准SQL类型相互转换的桥梁。如图9.1所示,通过Hibernate的基本数据类型可以非常方便地将数据从一种形式转换成另一种形式,完成高质量的ORM映射。图9.1数据类型间的转换表9.2列举了它们之间的数据类型的对应关系。Java EE实用教程9.3 对象关系映射对象关系映射9.3.1 继承关系映射继承关系映射使用继承来实现这样的对象模型在程序设计中应该是解决问题的简单办法
16、。例如,学生信息Xs.java代码为:importjava.util.Date;publicclassXsprivateintid;privateStringxh;privateStringxm;privateDatebir;/省略上述属性的get和set方法研究生信息Yjs.java代码为:publicclassYjsextendsXsprivateStringresearchResult;/科研成果/省略属性get和set方法Java EE实用教程9.3.1 继承关系映射继承关系映射本科生信息Bks.java代码为:publicclassBksextendsXsprivateboolean
17、ky;/是否考研/省略属性get和set方法可以看出,继承简化了程序的应用。现在就要考虑在数据库中的建表问题了,这种情况可以有3种方法来设计数据库。每个子类一个数据表。每个类一个数据表。共享一个数据表。Java EE实用教程9.3.1 继承关系映射继承关系映射h1每个子类一个数据表每个子类一个数据表这种设计非常简单,并没有对这些继承关系的特性做处理,这两张表对应了两个POJO类及各自的配置文件,它们之间并没有任何的关系。所以,这种方法简单,但是配置起来很啰唆,不能体现Hibernate的优势。设计数据库表,它们分别对应yjs表(如表9.3所示)和bks表(如表9.4所示)。字 段 名数据类型主
18、 键自 增允许为空描 述idint是增1id标识xhvarchar(50)学号xmvarchar(50)是姓名birdatetime是出生时间researchResultvarchar(50)是研究成果表9.3 yjs表Java EE实用教程9.3.1 继承关系映射继承关系映射字 段 名数据类型主 键自 增允许为空描 述idint是增1id标识xhvarchar(50)学号xmvarchar(50)姓名birdatetime出生时间kybit是否考研表9.4 bks表Java EE实用教程9.3.1 继承关系映射继承关系映射在项目中分别建立它们的POJO类。Yjs.java代码为:packag
19、eorg.vo;importjava.util.Date;publicclassYjsprivateintid;/id标识privateStringxh;/学号privateStringxm;/姓名privateDatebir;/出生时间privateStringresearchResult;/科研成果/省略上述属性的get和set方法Java EE实用教程9.3.1 继承关系映射继承关系映射Bks.java代码:packageorg.vo;importjava.util.Date;publicclassBksprivateintid;/id标识privateStringxh;/学号priva
20、teStringxm;/姓名privateDatebir;/出生时间privatebooleanky;/是否考研/省略上述属性的get和set方法Java EE实用教程9.3.1 继承关系映射继承关系映射建立映射文件。Yjs.hbm.xml配置文件为:Java EE实用教程9.3.1 继承关系映射继承关系映射Bks.hbm.xml与Yjs.hbm.xml类似,只需要修改class的属性name和table的值,即把修改为:然后把研究生的特有属性修改为本科生的特有属性,代码如下:改为:Java EE实用教程9.3.1 继承关系映射继承关系映射h2每个类一个数据表每个类一个数据表这种方法父类和子类
21、都要各自对应数据库中的一张表,并且子类和父类之间应用主键来设置它们的关联关系。表9.5(xs表)、表9.6(yjs表)、表9.7(bks表)分别展示了它们的表关系。字 段 名数据类型主 键自 增允许为空描 述idint是增1id标识xhvarchar(50)学号xmvarchar(50)是姓名birdatetime是出生时间表9.5 xs表Java EE实用教程9.3.1 继承关系映射继承关系映射字 段 名数据类型主 键自 增允许为空描 述xsIdint是id标识,并且作为外键参照xs表researchResultvarchar(50)是研究成果字 段 名数据类型主 键自 增允许为空描 述xs
22、Idint是id标识,并且作为外键参照xs表kybit是是否考研表9.6 yjs表表9.7 bks表Java EE实用教程9.3.1 继承关系映射继承关系映射在类中建立POJO类。Xs.java代码为:packageorg.vo;importjava.util.Date;publicclassXsprivateintid;privateStringxh;privateStringxm;privateDatebir;/省略上面属性的get和set方法Java EE实用教程9.3.1 继承关系映射继承关系映射Yjs.java代码为:packageorg.vo;publicclassYjsexten
23、dsXsprivateintxsId;privateStringresearchResult;/省略上面属性的get和set方法Bks.java代码为:packageorg.vo;publicclassBksextendsXsprivateintxsId;privatebooleanky;/省略上面属性的get和set方法Java EE实用教程9.3.1 继承关系映射继承关系映射这种情况下只需要配置一个Xs.hbm.xml即可,在该配置文件中要把Yjs与Bks的信息配置出来。对数据的存取。/插入一条研究生记录publicvoidsaveYjs()Yjsyjs=newYjs();yjs.setX
24、h(081101);yjs.setXm(程明);yjs.setBir(newDate();yjs.setResearchResult(5项成果);Transactionts=session.beginTransaction();session.save(yjs);mit();Java EE实用教程9.3.1 继承关系映射继承关系映射执行程序后,会把xh、xm、bir记录插入xs表中,把本条记录的id值及researchResult记录插入到yjs表中。/插入一条本科生记录publicvoidsaveBks()Bksbks=newBks();bks.setXh(081102);bks.setXm
25、(李方方);bks.setBir(newDate();bks.setKy(true);Transactionts=session.beginTransaction();session.save(bks);mit();Java EE实用教程9.3.1 继承关系映射继承关系映射执行程序后,会把xh、xm、bir记录插入xs表中,把本条记录的id值及ky记录插入到bks表中。/查询记录publicvoidquery()Listlist=session.createQuery(fromYjs).list();for(inti=0;i);System.out.println(yjs.getResearc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernate 映射 机制 精品
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内