一对多关联映射学习总结——hibernate.pdf_第1页
一对多关联映射学习总结——hibernate.pdf_第2页
一对多关联映射学习总结——hibernate.pdf_第3页
一对多关联映射学习总结——hibernate.pdf_第4页
一对多关联映射学习总结——hibernate.pdf_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

一对多关联映射一对多关联映射 one to manyone to many单向 单向 一 一 对象模型对象模型 在对象模型中一对多关联映射 通常在一的一端要使用在对象模型中一对多关联映射 通常在一的一端要使用集合集合来表示关联关系 来表示关联关系 比如班级比如班级 学生就是一个典型的一对多的关系 学生就是一个典型的一对多的关系 说明 之所以在一的一端需要持有对多的一端集合引用 是为了方便在加载班级的时候同时加载对应班说明 之所以在一的一端需要持有对多的一端集合引用 是为了方便在加载班级的时候同时加载对应班级级 下面的学生 下面的学生 二 原理二 原理 实现原理 先有班级 实现原理 先有班级 one one 后有学生后有学生 many many 实现一对多需要在多的一端建立外键指向一的端 实现一对多需要在多的一端建立外键指向一的端 one to manyone to many单向单向 就是能从就是能从 CleassesCleasses中访问到对应的学生 反之无效中访问到对应的学生 反之无效 三 面试题三 面试题 面试题 多对一与一对多的区别与联系 面试题 多对一与一对多的区别与联系 一对多关联映射一对多关联映射利用了多对一关联映射原理利用了多对一关联映射原理 多对一关联映射多对一关联映射 在 在多的一端多的一端加入一个外键指向加入一个外键指向一的一端一的一端 它维护的关系是 它维护的关系是多指向一 多指向一 Person GroupPerson Group 一对多关联映射一对多关联映射 在 在多的一端多的一端加入一个外键指向加入一个外键指向一的一端一的一端 它维护的关系是 它维护的关系是一指向多 一指向多 Classes StudentsClasses Students 总结总结 也就是说一对多和多对一的映射策略是一样的 也就是说一对多和多对一的映射策略是一样的 只是角度不同只是角度不同 四 业务模型四 业务模型 实体类实体类 ClassesPOJO javaClassesPOJO java privateprivate intint idid privateprivate StringString namename privateprivate SetSet students students 一指向多一指向多 StudentPOJO javaStudentPOJO java privateprivate intint idid privateprivate StringString namename 五 五 配置文件配置文件 1 1 一的一端一的一端 Classes hbm xml Classes hbm xml 的配置 需要加入的配置 需要加入标签标签 set key one to many setname students keycolumn classesid one to manyclass Student 2 2 多的一端多的一端 Student hbm xml Student hbm xml 的配置 的配置 ID ID自动增长自动增长 六 六 代码测试代码测试 1 1 savesave操作操作 存储策略存储策略 因为在因为在 ClassesClasses实体类实体类 One One 中存在一个对中存在一个对 StudentStudent实体类的实体类的 SetSet集合引用 集合引用 所以要先存所以要先存 StudentStudent 对象对象 然后在为 然后在为 StudentStudent分配班级 分配班级 publicpublic voidvoid testSave1 testSave1 SessionSession sessionsession nullnull trytry sessionsession HibernateUtils getSession HibernateUtils getSession session beginTransaction session beginTransaction 创建学生创建学生1 1 StudentStudent student1student1 newnew Student Student student1student1 setName setName 张三张三 session save session save student1student1 记得要先保存学生信息到数据库记得要先保存学生信息到数据库 创建学生创建学生2 2 StudentStudent student2student2 newnew Student Student student2 setName student2 setName 李四李四 session save student2 session save student2 记得要先保存学生信息到数据库记得要先保存学生信息到数据库 将将学生放入学生放入ClassesClasses实体的实体的SetSet集合集合 SetSet studentsstudents newnew HashSet HashSet students add students add student1student1 students add student2 students add student2 创建学生对象并创建学生对象并把学生集合在放入把学生集合在放入到到班级班级对象对象中中 ClassesClasses classesclasses newnew Classes Classes classes setName classes setName sd0801sd0801 为班级分配学生为班级分配学生 classes setStudents students classes setStudents students 保存班级对象的同时也把对应班级的学生存入数据库保存班级对象的同时也把对应班级的学生存入数据库 session save classes session save classes session getTransaction commit session getTransaction commit catchcatch Exception Exception e e e printStackTrace e printStackTrace session getTransaction rollback session getTransaction rollback finallyfinally HibernateUtils closeSession session HibernateUtils closeSession session 说明说明 1 1 上面方法之所以可以正确保存学生对象 是因为上面方法之所以可以正确保存学生对象 是因为 t studentst students表中的外键表中的外键 classesidclassesid约束允许为空 约束允许为空 假如此外键设置非空了将会插入数据库的时候报错 假如此外键设置非空了将会插入数据库的时候报错 2 2 上面代码的插入数据库的流程上面代码的插入数据库的流程 先存入学生对象先存入学生对象 id id自增 自增 namename程序设定 程序设定 classesidclassesid为空为空 当创建完 当创建完班班 级对象后 在象数据库存入班级信息的时候在同时把班级的级对象后 在象数据库存入班级信息的时候在同时把班级的 idid 做为外键同时也为做为外键同时也为 t studentst students表的表的 classesidclassesid 存入对应班级的存入对应班级的 idid 此时 此时 HibernateHibernate会发出会发出 updateupdate语句 由此可得出结论语句 由此可得出结论 假如同时批量创建学生对象 然假如同时批量创建学生对象 然 后为多个学生分配班级 此时后为多个学生分配班级 此时 hibernatehibernate会发出多个会发出多个 updateupdate语句去为语句去为 t studentst students表外键表外键 classesidclassesid赋值 赋值 所所 以影像了程序的性能 以影像了程序的性能 2 2 LoadLoad操作操作 加载班级看对应班级的学生信息加载班级看对应班级的学生信息 publicpublic voidvoid testLoad1 testLoad1 SessionSession sessionsession nullnull trytry sessionsession HibernateUtils getSession HibernateUtils getSession session beginTransaction session beginTransaction 先加载班级先加载班级 ClassesClasses classesclasses Classes session load Classes Classes session load Classes classclass 1 1 打印班级名称打印班级名称 System System outout println println classes name classes name classes getName classes getName 获取班级中的学生信息获取班级中的学生信息 SetSet studentsstudents classes getStudents classes getStudents forfor Iterator Iterator iter students iterator iter students iterator iter hasNext iter hasNext StudentStudent studentstudent Student iter next Student iter next System System outout println student name println student name student getName student getName session getTransaction commit session getTransaction commit catchcatch Exception Exception e e e printStackTrace e printStackTrace session getTransaction rollback session getTransaction rollback finallyfinally HibernateUtils closeSession session HibernateUtils closeSession session 在一一端维护关系的缺点 在一一端维护关系的缺点 如果将如果将 t studentt student表里的表里的 classesidclassesid字段设置为非空 则无法保存字段设置为非空 则无法保存 因为不是在因为不是在 studentstudent这一端维护关系 所以这一端维护关系 所以 studentstudent不知道是哪个班的 不知道是哪个班的 所以需要发出多余的所以需要发出多余的 updateupdate语句来更新关系语句来更新关系 所以建议采用下面的双向关联一对多所以建议采用下面的双向关联一对多 一对多关联映射一对多关联映射 one to manyone to many双向 常用 双向 常用 一 一 如何实现一对多双向如何实现一对多双向 实现原理实现原理 1 1 在一的一端的实体类中加入对多的一端的在一的一端的实体类中加入对多的一端的 SetSet接口引用接口引用 如如 privateprivate SetSet students students 一指向多 一指向多 SetSet 2 2 在多的一端的实体类中加入对一的一端的实体引用在多的一端的实体类中加入对一的一端的实体引用 如如 privateprivate ClassesClasses classidclassid 多指向一 多指向一 vovo 对象模型实例图如下对象模型实例图如下 二 二 实体类映射的配置文件实体类映射的配置文件 Classess hb xmlClassess hb xml Student hb xmlStudent hb xml many to onemany to one会用会用namename属性的值来生成一个外键指向一的一端 维护多对一的关系 但是在一对多双属性的值来生成一个外键指向一的一端 维护多对一的关系 但是在一对多双 向关联的时候必须用向关联的时候必须用columncolumn属性把属性把namename属性的值绑定在一起属性的值绑定在一起 此时此时classidclassid对应于对应于Classes hbm xmlClasses hbm xml文件中文件中 key column classid 三 代码测试三 代码测试 双向关联的存储双向关联的存储 publicpublic voidvoid testSave02 testSave02 sessionsession HibernateUtils HibernateUtils getSessiongetSession sessionsession beginTransaction beginTransaction 先创建好班级先创建好班级 ClassessClassess classessclassess newnew Classess Classess classess setName classess setName 0802 0802 sessionsession save classess save classess 按需要给对应的学生分配班级按需要给对应的学生分配班级 StudentStudent studentstudent newnew Student Student student setName student setName 李四李四 student setClassess classess student setClassess classess sessionsession save student save student sessionsession getTransaction commit getTransaction commit 双向关联查询双向关联查询 publicpublic voidvoid testLoad testLoad SessionSession sessionsession HibernateUtils HibernateUtils getSessiongetSession StudentStudent stustu Student session load Student Student session load Student classclass 4 4 System System outout println println 单向获取的姓名单向获取的姓名 stu getName stu getName System System outout println println 单向获取的班级单向获取的班级 stu getClassess getName stu getClassess getName ClassessClassess classesclasses Classess session load Classess Classess session load Classess classclass 4 4 SystemSystem outout println println 获取班级姓名获取班级姓名 classes getName classes getName 四 四 相关总结相关总结 1 1 hihernatehihernate一对多关联映射 双

温馨提示

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

评论

0/150

提交评论