09hibernate多对关联关系映射_第1页
09hibernate多对关联关系映射_第2页
09hibernate多对关联关系映射_第3页
09hibernate多对关联关系映射_第4页
09hibernate多对关联关系映射_第5页
免费预览已结束,剩余16页可下载查看

付费下载

下载本文档

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

文档简介

1、北京传智播客教育 Hibernate多对多关联关系映射李 若 亮北京传智播客教育 多对多关系日常事务处理中,存在有如下模型一位讲师带多名学生的课程,一位学生听多名讲师的课程,在此,讲师与学生形成了多对多的映射关系一位用户有多个角色,一个角色有多个用户,用户与角色形成了多对多的关系此时需要添加中间关系表来描述上述现象讲师表 关系表 学生表Hibernate中使用多对多的关系映射描述上述现象编号姓名昵称1李若亮Jock2张三丰祖师编号tea_idStu_id121212编号姓名班级1张翠山武当2张三Java北京传智播客教育 多对多数据库表(左方)创建教师表,用于描述多对多关系中的左方北京传智播客教

2、育 多对多数据库表(右方)创建学生表,用于描述多对多关系中的右方北京传智播客教育 多对多数据库表(关系表)创建关系表,用于描述多对多关系中的关系表北京传智播客教育 多对多模型(左方)创建教师类,用于描述多对多中的左方,并在类中描述一个老师对应多个学生的关系由于学生信息不能重复,因此使用Set集合进行描述Set集合初始化为任意Set模型集合,推荐使用HashSet北京传智播客教育 多对多模型(右方)创建学生类,用于描述多对多中的右方,并在类中描述一个学生对应多个老师的关系由于教师信息不能重复,因此使用Set集合进行描述Set集合初始化为任意Set模型集合,推荐使用HashSet北京传智播客教育

3、多对多配置关系(左方)创建学生模型配置文件TeacherModel.hbm.xml,用于描述多对多中的左方,并在配置中添加对应关系多对多关系中左方需要在配置文件中描述多对多的关系北京传智播客教育 多对多配置关系(右方)创建学生模型配置文件StudentModel.hbm.xml ,用于描述多对多中的左方,并在配置中添加对应关系多对多关系中左方需要在配置文件中描述多对多的关系北京传智播客教育 多对多配置关系(属性)在class配置中设置多对多的关系 模型中的集合名称关系表表名关系表中模型外键关联模型类名关系表中关联模型外键本方关联方北京传智播客教育 多对多关系资源注册最后将两个资源文件全部注册到

4、系统配置中多对多关系配置完成北京传智播客教育 基于多对多映射关系的操作(单增)单独添加数据与多对多映射没有任何关系,属于Hibernate的基本操作北京传智播客教育 基于多对多映射关系的操作(同增)同时添加,需要先指定对象间的关系首先关联多对多的关系sm.getTeachers().add(tm);tm.getStudents().add(sm);添加对应的记录s.save(sm);s.save(tm);此时会在关系表中创建两个关联关系,原因就是两个对象都进行了关系维护,也就是在添加sm与tm时,分别对关系进行了维护操作北京传智播客教育 基于多对多映射关系的操作(同增)在进行多对多的同时添加时

5、,由于不存在明确的A到B的关系和B到A的关系,因此无法确认明确的主从方此时,通常根据业务来确定主从方。此业务中,通常设定学生方为主方,教师方为从方。上述问题解决方案,使从方不具备关系维护能力断开从方的关系维护,为从方添加inverse=“true”北京传智播客教育 基于多对多映射关系的操作(添加关系)当双方实体不具有关联关系时,为其添加关联关系StudentModel sm = (StudentModel) s.get(StudentModel.class, 2L);TeacherModel tm = (TeacherModel) s.get(TeacherModel.class, 2L);s

6、m.getTeachers().add(tm);tm.getStudents().add(sm);注意:如果此时双方都能维护关系,关系表中将出现两条关联数据解决方案:使其中一方失去关系维护权,绑定关系时就不会出现两条关联数据了北京传智播客教育 基于多对多映射关系的操作(删除关系)当双方实体具有关联关系时,为其解除关联关系StudentModel sm = (StudentModel) s.get(StudentModel.class, 2L);TeacherModel tm = (TeacherModel) s.get(TeacherModel.class, 2L);sm.getTeacher

7、s().remove(tm);tm.getStudents().remove(sm);北京传智播客教育 基于多对多映射关系的操作(修改关系)修改实体A与B的关系为实体A与C的关系StudentModel sm = (StudentModel) s.get(StudentModel.class, 1L);TeacherModel tm1 = (TeacherModel) s.get(TeacherModel.class, 1L);TeacherModel tm2 = (TeacherModel) s.get(TeacherModel.class, 2L);断开原始的关系(sm与tm1)sm.ge

8、tTeachers().remove(tm1);tm1.getStudents().remove(sm);添加新的关系(sm与tm2)sm.getTeachers().add(tm2);tm2.getStudents().add(sm);注意:当实体A与实体B间存在关系,需要修改为实体A与实习C间存在关系时,并不是进行修改操作,而是先断开AB之间的关系,然后建立AC之间的关系,因此执行的应该是删除与添加操作,不是修改操作北京传智播客教育 基于多对多映射关系的操作(单删)单独删除指删除多对多中任意一方实体,同时将实体对应关系删除掉(主流)StudentModel sm = (StudentMod

9、el) s.get(StudentModel.class, 20L);s.delete(sm);删除后由于主方负责维护关系,因此关系被清除如果换成从方删除数据,关系是否被清除?(非主流)TeacherModel tm = (TeacherModel) s.get(TeacherModel.class, 1L);s.delete(tm);由于设置了从方不维护关系inverse=“true”,因此在操作时出问题,给从方重新分配关系维护权利北京传智播客教育 基于多对多映射关系的操作(单删)解除了关系维护限制后,从方也可以进行单独删除,并将关系清除。此时也就没有主从双方划分总结:对于多对多关系中,如果

10、明确主从双方,也就是为从方设置放弃关系维护inverse=“true” ,那么单独删除要从主方发起,从方不能发起(主流)对于多对多关系中,如果不明确主从双方,也就是都不设置inverse=“true” ,那么单独删除可以从任何一方发起,但是添加时的关系维护只能由一方发起,不能双方都发起,否则会出现关系数据重复现象(非主流)北京传智播客教育 基于多对多映射关系的操作(级联删除)多对多关系中是否可以在删除一方时,级联另一方,将另一方也删除。这种业务需求在实际项目中几乎不存在区分主从双方(从方inverse=“true”)删除主 (成功)删除从 (失败)不区分主从双方(双方inverse=“false”)删除任意一方,配置级联删除cascade=“delete”(成功)此时关系维护受双

温馨提示

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

评论

0/150

提交评论