一对多关联映射学习总结——hibernate_第1页
一对多关联映射学习总结——hibernate_第2页
一对多关联映射学习总结——hibernate_第3页
一对多关联映射学习总结——hibernate_第4页
一对多关联映射学习总结——hibernate_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

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

文档简介

1、一对多关联映射(one-to-many单向)、对象模型集合来表示关联关系在对象模型中一对多关联映射,通常在一的一端要使用 比如班级-> 学生就是一个典型的一对多的关系。一对多关联映射(one-to-many单向)一对多关联映射(one-to-many单向)一对多关联映射(one-to-many单向)说明:之所以在一的一端需要持有对多的一端集合引用,是为了方便在加载班级的时候同时加载对应班级 F面的学生。二、原理【实现原理】先有班级one后有学生many,实现一对多需要在多的一端建立外键指向一的端 one-to-many单向:就是能从Cleasses中访问到对应的学生,反之无效.三、面试题

2、【面试题】多对一与一对多的区别与联系? 一对多关联映射利用了多对一关联映射原理 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是 多指向一(Person-Group) 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多(Classes-Students ) 总结:也就是说一对多和多对一的映射策略是一样的,只是角度不同四、业务模型(实体类)ClassesPOJO.javaprivate int id ;privateStri ng n ameprivateSet students;/ 一指向多Stude ntPOJO.javaprivate int id

3、 ;private Stri ng n ame五、配置文件(1)一的一端(Classes.hbm.xml)的配置:需要加入<set>标签<set name二"students( Classes实体类中 Set接口类型的变量名 )">vkey column二"classid(对应于多的一端在数据库中的外键)"/>vone-to-many class="多的一端实体类的路径"></set>vhiber nate-mapp ingpackage ="com.tare na.hiber

4、 nate">vclass n ame="Classes" table ="t_classes" ><id name="id" >vgeneratorclass 二"native" /></ id >vpropertyn ame= "n ame"/>vset name="students">vkey column二"classesid"/>von e-to-ma ny class二&qu

5、ot;Stude nt"/>v/set>v/ class >v/ hibernate-mapping>(2) 多的一端(Student.hbm.xml)的配置:vhiber nate-mapp ing >vclass n ame="com.bjsxt.tare na.Stude nt"table ="t_stude nt">vid name="id" >vgeneratorclass 二"native" />/ID 自动增长v/ id >vproper

6、tyn ame= "n ame"/>v/ class >v/ hibernate-mapping>六、代码测试(1) save 操作()Stude nt存储策略:因为在 Classes实体类(One)中存在一个对 Student实体类的Set集合引用,所以要先存 对象,然后在为Student分配班级。public void testSave1() Session session 二 null ;try session二 HibernateUtils.getSession();sessi on .beg inTran sact ion();/创建学生1Stu

7、dent student1 = new Student();student1.setName("张三");session.save(studentl); /记得要先保存学生信息到数据库/创建学生2Student student2 = new Student();student2.setName("李四");session.save(student2);/记得要先保存学生信息到数据库/将学生放入Classes实体的Set集合Set students= new HashSet();stude nts.add(stude nt2);/创建学生对象并把学生集合在

8、放入到班级对象中Classes classes = new Classes。; classes.setName( "sd0801" ); / 为班级分配学生 classes.setStude nts(stude nts);/保存班级对象的同时也把对应班级的学生存入数据库sessi on. save(classes); sessio n.getTra nsactio n().commit(); catch (Exceptione) e.pri ntStackTrace();sessio n.getTra nsactio n().rollback();fin allyHiber

9、nateUtils.closeSessio n(sessio n);t_students 表中的外键 classesid 约束允许为空,自增,name程序设定,classesid为空),当创建完班id做为外键同时也为t_students 表的classesid由此可得出结论:假如同时批量创建学生对象,然 语句去为说明:(1)上面方法之所以可以正确保存学生对象,是因为 假如此外键设置非空了将会插入数据库的时候报错。(2)上面代码的插入数据库的流程:先存入学生对象(id 级对象后,在象数据库存入班级信息的时候在同时把班级的t_students表外键 classesid 赋值,所存入对应班级的id

10、(此时Hibernate 会发出update语句), 后为多个学生分配班级,此时hibernate会发出多个update以影像了程序的性能。Load操作(加载班级看对应班级的学生信息)public void testLoad1() Session session 二 null ;try session 二 HibernateUtils.getSession();sessi on .begi nTran sacti on();/先加载班级Classes classes = (Classes)session.load(Classes. class , 1);/打印班级名称System. out .

11、println("="+ classes.getName();/获取班级中的学生信息Set students = classes.getStudents();for (Iteratoriter=stude nts.iterator();iter.hasNext();) Stude nt stude nt = (Stude nt)iter. next();System. out .println('二"+student.getName(); sessio n.getTra nsactio n().commit(

12、); catch (Exceptione) e.pri ntStackTrace();sessio n.getTra nsactio n().rollback();fin allyHibern ateUtils.closeSessio n(sessio n);在一一端维护关系的缺点:*如果将t_student 表里的classesid字段设置为非空,则无法保存*因为不是在student这一端维护关系,所以student不知道是哪个班的,所以需要发出多余的update语句来更新关系(所以建议采用下面的双向关联一对多)一对多关联映射(one-to-many双向(常用)、如何实现一对多双向(实现原理

13、)(1)在一的一端的实体类中加入对多的一端的Set接口引用女如: privateSet students; / 一指向多(Set)(2)在多的一端的实体类中加入对一的一端的实体引用女如: privateClasses classid; / 多指向一(vo)对象模型实例图如下:二、实体类映射的配置文件Classess.hb.xml :vhiber nate-mapp ing><class n ame="shua ngXia ng.pojo.Classess"table ="t_classes" ><id name="id&

14、quot;column 二"id" type ="java.lang.lnteger" >vgenerator class 二"native" /></ id ><set n ame="stude nts"in verse二"true"cascade="all" ><!-对应Classes实体类中 private Set students; ->vkey column二"classid"/><!-

15、 对应于多的一端在数据库中的外键 ->von e-to-ma nyclass ="shua ngXia ng.pojo.Stude nt"/><!-多的一端实体类的路径-></ set ></ class ></ hiber nate-mapp ing>Stude nt.hb.xmlvhiber nate-mapp ing>vclass n ame="shua ngXia ng.pojo.Stude nt"table ="t_stude nt" ><id n

16、ame="id"column 二"id"type ="java.lang.lnteger">vgenerator class 二"native" /></ id >vpropertyname="name" column 二"name" type -'java.lang.String"/>vmany-to-one name="classess"column 二"classid">v/

17、many-to-one >v!- many-to-one会用namei性的值来生成一个外键指向一的一端,维护多对一的关系,但是在一对多双 向关联的时候必须用column属性把nami性的值绑定在一起(此时classid对应于Classes.hbm.xml文件中vkey colu mn 二"classid"/;)->v/ class >v/ hibernate-mapping>三、代码测试/*双向关联的存储*/public void testSaveO2()session 二 HibernateUtils.getSession ();session .

18、beginTransaction();/先创建好班级Classess classess = new Classess(); classess.setName( "0802");session .save(classess);/按需要给对应的学生分配班级Student student = new Student(); student.setName("李四"); stude nt.setClassess(classess);session .save(student);session .getTransaction().commit();/*双向关联查询*/public void testLoad()Session session二 HibernateUtils. getSession ();Student stu = (Student)session.load(Student.class ,4);"单向获取的姓名:"+stu.getName();"单向获取的班级:"+stu.getClassess().

温馨提示

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

评论

0/150

提交评论