




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第13章使用Hibernate实现关联映射和继承映射,1,目录,1,2,3,基于XML映射文件实现关联映射,基于Annotation注解实现关联映射,基于XML映射文件实现继承映射,2,13.1,基于XML映射文件实现关联映射,3,13.1.1单向多对一关联,4,单向多对一关联是最为常见的单向关联关系,单向多对一映射关系是由“多”的一方指向“一”的一方。在表示“多”的一方数据表中增加一个外键来指向表示“一”的一方数据表,“一”的一方作为主表,“多”的一方作为从表。数据库restrant中餐品信息表meal和菜系表mealseries对应关系是一种多对一关系,因为在meal表中有多条餐品记录对应mealseries表中同一个菜系记录,如图所示。单向多对一关联只需从“多”的一端访问“一”的一端,所以只需要在“多”的一方的实体类和映射文件中进行配置,而不用考虑“一”的一方。,13.1.1单向多对一关联,5,实现数据表meal和mealseries之间单向多对一关联映射的步骤如下所示:将项目hibernate-1复制并命名为“hibernate-3”,再导入到MyEclipse开发环境中。创建实体类,菜系实体Mealseries.java和餐品实体Meal.java,在Meal中使用Mealseries类声明属性。创建映射文件,Meal.hbm.xml和Mealseries.hbm.xml。将上述两个映射文件通过标签添加到Hibernate配置文件hibernate.cfg.xml中。在项目hibernate-3的测试类HibernateTest中添加测试方法testM2OGet(),并使用Test注解修饰。获取指定编号的餐品信息对象,同时获取关联的餐品菜系对象。“懒加载”或“延迟加载”,“立即加载”lazy=false,13.1.2单向一对多映射,6,meal对mealseries是单向多对一关联,反过来看,mealseries对meal便是单向一对多关联,即一个菜系可包含多个餐品信息。这也意味着每个Mealseries对象会引用一组Meal对象,因此需要在Mealseries类中定义一个集合类型的属性,在访问“一”的一方Mealseries对象时,关联的“多”的一方Meal的多个对象将保存到该集合类型的属性中。实现数据表mealseries和meal之间单向一对多关联映射的步骤如下所示:修改实体类Mealseries.java修改映射文件Mealseries.hbm.xml在测试类HibernateTest中添加测试方法testO2MGet(),13.1.3双向多对一映射,7,在前面小节分别对数据表meal与mealseries作了单向多对一和单向一对多关联,如果将两者结合起来便形成了双向关联。双向多对一关联也可称为双向一对多关联。在Hiberntae中通过设置inverse属性来决定由双向关联的哪一方来维护表和表之间的关联关系当其中的一方设置inverse=true时,表示将控制权反转,此时由对方(主动方)负责维护关联关系。inverse属性的默认值为false,在双方都没有设置inverse=true的情况下,双方都维护关联关系,会影响性能。通常,由“多”的一方作为主动方维护关联关系有助于性能的改善。,13.1.3双向多对一映射,8,添加数据在数据表mealseries中添加一个新的菜系“淮扬菜”,并在数据表meal中添加两个菜系为淮扬菜的餐品。修改映射文件Mealseries.hbm.xml,给元素添加inverse属性,并设置inverse=true,将控制权反转,此时由“多”的一方(Meal)作为主动方来维护双方的关联关系,即“一”的一方(Mealseries)放弃维护关联关系。在测试类HibernateTest中添加测试方法testM2OAndO2MSave(),并使用Test注解修饰。执行testM2OAndO2MSave()方法,数据表mealseries和meal添加的数据。控制台输出语句。,13.1.3双向多对一映射,9,修改数据在测试类HibernateTest中添加测试方法testM2OAndO2MUpdate(),并使用Test注解修饰。在testM2OAndO2MUpdate()方法中,将数据表meal中编号id=7的餐品的菜系由“鲁菜”(id为1)修改为“川菜”(id为2)。执行testM2OAndO2MUpdate()方法,查看数据表。删除数据在测试类HibernateTest中添加测试方法testM2OAndO2MDelete(),并使用Test注解修饰。在testM2OAndO2MDelete()方法中,将数据表mealseries中编号id=13的菜系记录删除。执行testM2OAndO2MDelete()方法,异常信息处理,修改映射文件Mealseries.hbm.xml,在元素中添加属性cascade,并将值设置为“delete”。,发生异常的原因在于:数据表meal中MealSeriesId外键字段引用了数据表mealseries的SeriesId字段,当准备从mealseries表中删除“淮扬菜”时,该菜系的SeriesId被meal表中的两条相关餐品记录所引用,只有先将meal表中参考该SeriesId的两条餐品记录删除。当然,没有必要这么麻烦,可以采用级联删除的方法,在删除mealseries表中记录的同时,会将meal表中关联的记录一同删除。,13.1.4双向多对多映射,10,在数据库restrant中,数据表admin和functions之间存在多对多关联关系,因为一个系统管理员可以使用系统的多个功能,一个系统功能也可能被多个管理员使用。在程序设计时,一般不建议直接在admin和functions之间建立多对多关联,这会造成两者之间的相互依赖。可以通过一个中间表来维护两者之间的多对多关联,这个中间表分别与admin和functions构成多对一关联。管理员信息表为admin,系统功能表为functions,中间表为powers,它同时参照admin和functions表。这三张表之间的关系图如图所示。powers表以aid和fid作为联合主键,其中,aid字段作为外键参照admin表的Id字段,fid字段作为外键参照functions表的id字段。,13.1.4双向多对多映射,11,实现数据表admin和functions双向多对多关联映射的步骤如下所示:将项目hibernate-1复制并命名为“hibernate-4”,再导入到MyEclipse开发环境中。在项目hibernate-4的com.hibernate.entity包中新建两个实体类Admin.java和Functions.java。在Admin.java中添加Set类型的属性fs,以体现与Functions的关联。在Functions.java中添加Set类型的属性as,以体现与Admin的关联。在项目hibernate-4的com.hibernate.entity包中创建映射文件Admin.hbm.xml和Functions.hbm.xml。将两个映射文件添加到Hibernate配置文件hibernate.cfg.xml中,,13.1.4双向多对多映射,12,添加数据,在测试类HibernateTest中添加测试方法testM2MSave(),并使用Test注解修饰。在testM2MSave()方法中新建两个管理员,新建三个系统功能,并设置关联关系,最后执行testM2MSave()保存操作。查看数据表admin、functions和powers中的记录。加载数据,在测试类HibernateTest中添加测试方法testM2MGet(),并使用Test注解修饰。在testM2MGet()方法中加载管理员及关联的系统功能属性。执行testM2MGet()方法,查看控制台结果。删除数据,在测试类HibernateTest中添加测试方法testM2MDelete(),并使用Test注解修饰。在testM2MDelete()方法删除指定管理员,执行testM2MDelete()方法,查看数据表admin和powers记录。,13.1.5双向一对一映射,13,基于外键的一对一关联映射基于外键的一对一关联与多对一关联实质相同,是多对一关联的一个特例。外键可以存放在任意一端,在存放外键的一端,增加元素,并在该元素中增加unique=“true”属性,表示多的一方也必须唯一,并使用name属性来指定关联属性的属性名。在另一端需要使用元素,同样使用name属性来指定关联属性的属性名。在数据库restrant中,新建数据表admin_detail,用于存储管理员的详细信息,如图所示。在数据表admin中添加一个字段Did,在后续设置其与数据表admin_detail的Id字段关联,如图所示。管理员信息表admin的Did字段作为该表的外键,需要保证该字段的唯一性,否则就不是一对一映射关系,而是多对一映射关系。,13.1.5双向一对一映射(基于外键),14,实现admin和admin_detail双向一对一关联映射步骤如下:将项目hibernate-1复制并命名为“hibernate-5”,导入。创建实体类,Admin.java和AdminDetail.java。创建映射文件,Admin.hbm.xml和AdminDetail.hbm.xml。添加数据,在测试类HibernateTest中添加测试方法testO2OSave(),运行testO2OSave(),查看数据表。加载数据在测试类HibernateTest中添加测试方法testO2OGet_1()。在testO2OGet_1()方法中先加载编号id=2的Admin对象,再加载关联的AdminDetail对象。在测试类HibernateTest中添加测试方法testO2OGet_2(),在testO2OGet_2()方法中先加载编号id=1的AdminDetail对象,再获取关联的Admin对象信息。删除数据,添加测试方法testO2ODelete()。,在映射文件Admin.hbm.xml中需要使用元素而不是元素来映射在Admin类中定义的AdminDetail类型的ad属性,但必须使用unique=true指定多的一端唯一,即满足唯一性约束,以实现一对一关联。,在映射文件AdminDetail.hbm.xml中,需要通过元素来映射从AdminDetail到Admin的一对一关联。使用property-ref=ad表明建立了从AdminDetail对象到Admin对象的关联,因此只需调用AdminDetail对象的getAdmin()方法就可以访问到Admin对象。,13.1.5双向一对一映射,15,基于主键的一对一关联基于主键的一对一关联就是限制两个数据表的主键使用相同的值,通过主键形成一对一映射关系。在实现基于外键的双向一对一关联映射时,数据表admin中添加了一个外键字段Did,与数据表admin_detail的Id字段关联。在实现基于主键的双向一对一关联时,需要将该外键字段did删除,并设置admin表的主键Id与admin_detail表主键Id关联。由于两个表主键相关联,因此需要保持两个数据表的主键Id一致,最好将两个表的数据全部清空后,再设置关联,如图所示。基于主键的双向一对一关联映射,需要使用foreign策略生成主键,任何一方都可以使用foreign策略,表明根据对方主键生成自己的主键。使用foreign策略的一方增加元素映射关联关系,还必须将其constrainted属性设置为true,而另一方只需增加元素映射关联属性即可。,13.1.5双向一对一映射(基于主键),16,实现admin_detail和admin双向一对一关联映射步骤:将项目hibernate-5复制并命名为“hibernate-6”,导入。修改映射文件Admin.hbm.xml和AdminDetail.hbm.xml。在映射文件Admin.hbm.xml中,先修改元素,再删除原先的元素,并配置元素在映射文件文件AdminDetail.hbm.xml中,只需修改元素。添加数据,执行测试类HibernateTest中的testO2OSave()方法,查看数据表中admin_detail和admin的记录。依次执行测试类HibernateTest中的testO2OGet_1()、testO2OGet_2()和testO2ODelete()等方法,,13.2,基于Annotation注解实现关联映射,17,13.2.1双向多对一映射,18,基于Annotation注解实现数据表meal和mealseries双向多对一关联映射的步骤如下:将项目hibernate-2复制并命名为“hibernate-7”,导入。在项目hibernate-7中创建Meal.java和Mealseries.java实体类。并基于Annotation注解实现持久化类Meal.java,基于Annotation注解实现持久化类Mealseries.java。在Hibernate配置文件hibernate.cfg.xml中添加对持久化类Meal和Mealseries类的引用。将hibernate-3的测试类HibernateTest中testM2OGet、testO2MGet、testM2OAndO2MSave、testM2OAndO2MUpdate和testM2OAndO2MDelete等测试方法复制到项目hibernate-7中,依次测试这些方法,查看测试效果。,在持久化类Meal中,需要定义一个Mealseries类型的关联属性mealseries,再使用ManyToOne和JoinColumn注解实现Meal到MealSeries的多对一关联。ManyToOne注解的fetch属性可选择项包括:FetchType.EAGER和FetchType.LAZY,前者表示关联类在主类加载的时候同时加载(立即加载),后者表示关联类在被访问时才加载(懒加载或延迟加载),在多对一时默认值是FetchType.EAGER,在一对多时默认值是FetchType.LAZY。JoinColumn(name=MealSeriesId)指定数据表meal的MealSeriesId字段作为外键与数据表mealseries的主键关联。,在持久化类Mealseries中,需要定义元素类型为Meal的关联集合属性mealSet,再使用OneToMany注解实现Mealseries到Meal的一对多关联。OneToMany注解的mappedBy属性作用相当于设置inverse=true,表示将关联关系的主管权反转,即由Meal管理双方的关联关系。mappedBy属性值为关联的多的一方(Meal类)所定义Mealseries类型的属性mealseries。cascade=CascadeType.REMOVE指定级联删除。,13.2.2双向多对多映射,19,基于Annotation注解实现数据表admin和functions之间的双向多对多关联映射,步骤如下:在项目hibernate-7中,创建实体类Functions.java和Admin.java,并基于Annotation注解实现的持久化类Functions,基于Annotation注解实现的持久化类Admin。在Hibernate配置文件hibernate.cfg.xml中添加对持久化类Functions和Admin类的引用。将项目hibernate-4的测试类HibernateTest中testM2MSave、testM2MGet和testM2MDelete等测试方法复制到项目hibernate-7的测试类HibernateTest中,依次测试这些方法,查看测试效果与hibernate-4相同。,在持久化类Functions中,定义了一个元素类型为Admin的关联集合adminSet,再使用ManyToMany注解实现Functions到Admin的多对多关联映射。在ManyToMany注解中,设置属性mappedBy=fs,作用相当于inverse=true,将关联关系控制权反转,即由Admin管理双方关联关系。“fs”是Admin类中定义的元素类型为Functions的集合。由于Admin是关联关系的主管方,因此Admin类和Functions类的多对多关联映射是在Admin类中实现的。,在持久化类Admin中,定义一个元素类型为Functions的关联集合fs,再使用ManyToMany注解和JoinTable注解实现Admin到Functions的多对多关联。JoinTable注解描述了多对多关系的数据表关系,name属性指定中间表的名称,这里为“powers”;joinColumns属性定义中间表powers与管理员表admin关联的外键列,这里为“aid”;inverseJoinColumns属性定义中间表powers与另一端系统功能表functions关联的外键列,这里为“fid”。,13.2.3双向一对一映射,20,使用Annotation注解实现数据表admin和admin_detail之间基于主键的双向一对一关联映射。步骤如下:在数据库中,数据表admin和admin_detail结构如图所示。设置admin表的主键Id与admin_detail表主键Id关联。将项目hibernate-2复制并命名为“hibernate-8”,导入。创建实体类,Admin.java和AdminDetail.java。使用Annotation注解完成持久化类配置后,还需在配置文件hibernate.cfg.xml中添加对持久化类的引用。将项目hibernate-6的测试类HibernateTest中testO2OSave、testO2OGet_1和testO2OGet_2和testO2ODelete等测试方法复制到项目hibernate-8的测试类HibernateTest中,并根据情况修改这些方法中所加载记录的编号Id。依次测试这些方法,测试效果与hibernate-6相同。,在持久化类Admin中,首先定义了AdminDetail类型关联属性ad,然后使用GenericGenerator、Id、GeneratedValue和Column这一组注解将Admin类中定义的AdminDetail类型的属性ad的主键来作为Admin类对象的主键。其中,GenericGenerator注解声明了一个Hibernate的主键生成策略,支持十三种策略。该注解的name属性指定生成器名称,strategy属性指定具体生成器的类名(即生成策略),这里选择foreign策略,表示使用另一个关联对象的主键,通常和联合起来使用。parameters属性得到strategy指定的具体生成器所用到的参数,设置value=ad表示将当前类Admin中定义的AdminDetail类型的ad属性的主键来作为Admin类对象的主键。再使用OneToOne注解实现Admin与AdminDetail的基于主键的一对一关联,设置属性mappedBy=admin作用相当于inverse=true,表示将关联关系的控制权反转,即由AdminDetail方管理关联关系,admin为AdminDetail类中定义的Admin类型的关联属性。设置属性optional=false指定关联属性ad不能为空。,在持久化类AdminDetail中,首先定义了Admin类型的关联属性admin,再使用OneToOne和PrimaryKeyJoinColumn注解实现AdminDetail与Admin的基于主键的一对一关联。设置cascade=CascadeType.REMOVE表示级联删除。PrimaryKeyJoinColumn注解表示两个实体通过主键关联。,13.3,基于XML映射文件实现继承映射,21,13.3.1使用subclass进行映射,22,将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态。使用subclass的继承映射可以实现对于继承关系中的父类和子类使用相同的一张表。因为父类和子类的实例全部都保存在同一个表中,因此需要在该表内增加一列,使用该列来区分每行记录到底是哪个类的实例,这个列被称为辨别者列(discriminator)。在这种映射策略下,使用subclass来映射子类,使用class或subclass的discriminator-vlaue属性指定辨别者列的值。所有子类定义的字段都不能有非空约束。所有子类定义的字段都不能有非空约束。如果为这些字段添加非空约束,那么父类的实例在那些列其实并没有值,这将引起数据库完整冲突,导致父类的实例无法保存。,13.3.1使用subclass进行映射,23,在restrant数据库中,新建persons表,表结构如图所示。将项目hibernate-1复制并命名为“hibernate-9”,再导入到MyEclipse开发环境中。在hibernate-9项目的src目录下的com.hibernate.entity包中新建Person类。新建Teacher类,并继承Person类。在com.hibernate.entity包中,创建映射文件Person.hbm.xml,对应实体类Person。将Person.hbm.xml映射文件通过添加到Hibernate配置文件hibernate.cfg.xml中。在项目hibernate-9的测试类HibernateTest中添加测试方法testExtendsSave(),并使用Test注解修饰,在该方法中新建Person对象和Teacher对象,添加数据。在HibernateTest中添加方法testExtendsQuery()查询数据。,13.3.2使用joined-subclass进行映射,24,对于继承关系中的子类使用同一个表,这就需要在数据库表中增加额外的区分子类类型的字段。采用joined-subclass元素继承映射可以实现每一个子类一张表。采用这种映射策略时,父类实例保存在父类表中,子类实例由父类表和子类表共同存储。因为子类实例也是一个特殊的父类实例,因此必然也包含了父类实例的属性。于是将子类和父类公有的属性保存在父类表中,子类增加的属性,则保存在子类表中。在这种映射策略下,无须使用鉴别者列,但需要为每个子类使用key元素映射共有主键。子类增加的属性可以添加非空约束,因为子类的属性和父类的属性没有保
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 妇女家庭劳务合同模板(3篇)
- 竞业禁止协议补偿金测算与员工离职补偿机制研究
- 大型仓储物流货车驾驶员聘用及仓储管理服务合同
- 高效玉米供应链全程管理长期购销合作协议
- 离婚程序服务协议:从协议签订到离婚的全方位指导
- 细化版住宅小区物业管理法规制度政策实施合同
- 劳动合同签订与企业人力资源规划合同
- 住宅小区物业管理权转让及社区环境治理协议
- (正式版)DB65∕T 3837-2015 《农田土壤残膜调查技术规范》
- 旅游度假村住宿租赁合同终止及费用结算协议
- 住房供给调控预案
- 培训行业转介绍
- 文科物理(兰州大学)学习通网课章节测试答案
- 人教版高二数学(上)选择性必修第一册1.2空间向量基本定理【教学设计】
- catia考试图纸题目及答案
- pos机风险管理办法
- 2025年行业机器人边缘计算技术应用与场景分析
- 2025年安徽省公务员录用考试《行测》真题及答案
- 山河已无恙+吾辈当自强+课件-2025-2026学年高二上学期用《南京照相馆》和731上一节思政课
- 中国兽药典三部 2020年版
- GB/T 7193-2008不饱和聚酯树脂试验方法
评论
0/150
提交评论