hibernate应用课堂.ppt
《hibernate应用课堂.ppt》由会员分享,可在线阅读,更多相关《hibernate应用课堂.ppt(119页珍藏版)》请在三一办公上搜索。
1、Hibernate关系映射,在面向对象设计和实体模型关系中,对象间关系一般包括4种:一对一(one-to-one)、一对多(one-to-many)、多对一(many-to-one)、多对多(many-to-many)对象是现实世界中具有唯一性的事物一对一关联类型:主键关联与唯一外键关联一对一的主键关联形式是两张关联表通过主键形成一对一映射关系唯一外键关联是两张表的主键值不同,使用一个新添加的字段来作为外键维持一对一关系单向一对多只需在“一”的一方进行配置,反之就是单向多对一双向一对多就是对单向一对多的一种改进,4.3 Hibernate关系映射,4.3.1 一对一关联1.共享主键方式在注册某
2、个论坛会员的时候,往往不但要填写登录账号和密码,还要填写其他的详细信息,这两部分信息通常会放在不同的表中,如表4.1、表4.2所示。,表4.1 登录表Login,表4.2 详细信息表Detail,4.3.1 一对一关联,登录表和详细信息表属于典型的一对一关联关系,可按共享主键方式进行。步骤如下:创建Java项目,命名为“Hibernate_mapping”。添加Hibernate开发能力,步骤同节第4步。HibernateSessionFactory类同样位于org.util包下。编写生成数据库表对应的Java类对象和映射文件。Login表对应的POJO类Login.java:,package
3、 org.model;public class Login implements private int id;/ID号 private String username;/登录账号 private String password;/密码 private Detail detail;/详细信息/省略上述各属性的getter和setter方法,4.3.1 一对一关联,Detail表对应的Detail.java:,package org.model;public class Detail implements private int id;/ID号 private String trueName;/
4、真实姓名 private String email;/电子邮件 private Login login;/登录信息/省略上述各属性的getter和setter方法,4.3.1 一对一关联,Login表与Login类的ORM映射文件。,detail,4.3.1 一对一关联,Detail表与Detail类的ORM映射文件:,name表示属性名字,class表示被关联的类的名字cascade=“all”表明主控类的所有操作,对关联类也执行同样操作lazy=false表示此关联为立即加载,4.3.1 一对一关联,在文件中加入配置映射文件的语句。创建测试类。在src文件夹下创建包test,在该包下建立测
5、试类“Test.java”。,Session session=HibernateSessionFactory.getSession();Transaction ts=session.beginTransaction();/创建事务对象Detail detail=new Detail();Login login=new Login();login.setUsername(yanhong);login.setPassword(123);detail.setTrueName(严红);detail.setEmail();/相互设置关联login.setDetail(detail);detail.set
6、Login(login);/这样完成后就可以通过Session对象调用session.save(detail)来持久化该对象session.save(detail);mit();HibernateSessionFactory.closeSession();,4.3.1 一对一关联,运行程序,测试结果。因为该程序为Java Application,所以可以直接运行。在完全没有操作数据库的情况下,程序就完成了对数据的插入。插入数据后,Login表和Detail表的内容如图4.12、图4.13所示。,图4.12 Login表 图4.13 Detail表,4.3.1 一对一关联,2.唯一外键方式唯一外
7、键的情况很多,例如,每个人对应一个房间。其实在很多情况下,可以是几个人住在同一个房间里面,就是多对一的关系。但是如果把这个多变成唯一,也就是说让一个人住一个房间,就变成了一对一的关系了,这就是前面说的一对一的关系其实是多对一关联关系的一种特殊情况。对应的Person表和Room表如表4.3、表4.4所示。,表4.3 Person表,表4.4 Room表,4.3.1 一对一关联,步骤如下:在项目Hibernate_mapping的org.model包下编写生成数据库表对应的Java类对象和映射文件。,Person表对应的POJO类Person.java:package org.model;pub
8、lic class Person implements private Integer id;private String name;private Room room;/省略上述各属性的getter和setter方法Room表对应的POJO类Room.java:package org.model;public class Room implements private int id;private String address;private Person person;/省略上述各属性的getter和setter方法,4.3.1 一对一关联,Person表与Person类的ORM映射文件:
9、,/唯一性约束,实现一对一,4.3.1 一对一关联,Room表与Room类的ORM映射文件:,/指定关联类的属性名,4.3.1 一对一关联,在文件中加入如下的配置映射文件的语句。编写测试代码。在src文件夹下的包test的Test类中加入如下代码:,Person person=new Person();person.setName(liumin);Room room=new Room();room.setAddress(NJ-S1-328);person.setRoom(room);session.save(person);,4.3.1 一对一关联,运行程序,测试结果。因为该程序为Java A
10、pplication,所以可以直接运行。在完全没有操作数据库的情况下,程序就完成了对数据的插入。插入数据后,Person表和Room表的内容如图4.14、图4.15所示。,图4.14 Person表 图4.15 Room表,4.3.2 多对一单向关联,只要把上例中的一对一的唯一外键关联实例稍微修改就可以变成多对一。步骤如下:在项目Hibernate_mapping的org.model包下编写生成数据库表对应的Java类对象和映射文件。其对应表不变,Person表对应的类也不变,对应的文件修改如下:,/主控类所有操作,对关联类也执行同样操作,4.3.2 多对一单向关联,而Room表不变,对应的P
11、OJO类如下:Room表与Room类的ORM映射文件如下:,package org.model;public class Room implements private int id;private String address;/省略上述各属性的getter和setter方法,4.3.2 多对一单向关联,编写测试代码。在src文件夹下的包test的Test类中加入如下代码:,Room room=new Room();room.setAddress(NJ-S1-328);Person person=new Person();person.setName(liuyanmin);person.se
12、tRoom(room);session.save(person);,4.3.2 多对一单向关联,运行程序,测试结果。因为该程序为Java Application,所以可以直接运行。在完全没有操作数据库的情况下,程序就完成了对数据的插入。插入数据后,Person表和Room表的内容如图4.16、图4.17所示。,图4.16 Person表 图4.17 Room表,4.3.3 一对多双向关联,下面通过修改节的例子来完成双向多对一的实现。步骤如下:在项目Hibernate_mapping的org.model包下编写生成数据库表对应的Java类对象和映射文件。Person表对应的POJO及其映射文件不
13、用改变,现在来修改Room表对应的POJO类及其映射文件。对应的POJO:,package org.model;import;import;public class Room private int id;private String address;private Set person=new HashSet();/集合,存放多个Person对象/省略getter和setter方法,4.3.3 一对多双向关联,下面通过修改节的例子来完成双向多对一的实现。步骤如下:在项目Hibernate_mapping的org.model包下编写生成数据库表对应的Java类对象和映射文件。Room表与Roo
14、m类的ORM映射文件。,/级联程度/充当外键的字段名/被关联的类名字,表示关联关系的维护工作由谁来负责,默认false,表示由主控方负责;true表示由被控方负责。由于该例是双向操作,故需要设为false,也可不写,22,inverse,只有集合标记(set/map/list/array/bag)才有inverse属性在 Hibernate 中,inverse 指定了关联关系的方向。关联 关系中 inverse=false 的为主动方,由主动方负责维护 关联关系在没有设置 inverse=true 的情况下,父子两边都维护父子 关系 在 1-N 关系中,将 many 方设为主控方(invers
15、e=false)将有助于性能改善(如果要国家元首记住全国人民的名字,不 是太可能,但要让全国人民知道国家元首,就容易的多)在 1-N 关系中,若将 1 方设为主控方会额外多出 update 语句。插入数据时无法同时插入外键列,因而无法为外键列添加非空约束,4.3.3 一对多双向关联,下面通过修改节的例子来完成双向多对一的实现。步骤如下:在项目Hibernate_mapping的org.model包下编写生成数据库表对应的Java类对象和映射文件。该配置文件中cascade配置的是级联程度,它有以下几种取值:,all:表示所有操作句在关联层级上进行连锁操作。save-update:表示只有sav
16、e和update操作进行连锁操作。delete:表示只有delete操作进行连锁操作。all-delete-orphan:在删除当前持久化对象时,它相当于delete;在保存或更新当前持久化对象时,它相当于save-update。另外它还可以删除与当前持久化对象断开关联关系的其他持久化对象。,4.3.3 一对多双向关联,编写测试代码。在src文件夹下的包test的Test类中加入如下代码:,Person person1=new Person();Person person2=new Person();Room room=new Room();room.setAddress(NJ-S1-328)
17、;person1.setName(李方方);person2.setName(王艳);person1.setRoom(room);person2.setRoom(room);/这样完成后就可以通过Session对象/调用session.save(person1)和session.save(person)/会自动保存roomsession.save(person1);session.save(person2);,4.3.3 一对多双向关联,运行程序,测试结果。因为该程序为Java Application,所以可以直接运行。在完全没有操作数据库的情况下,程序就完成了对数据的插入。插入数据后,Pers
18、on表和Room表的内容如图4.18、图4.19所示。,图4.18 Person表 图4.19 Room表,4.3.3 一对多双向关联,由于是双向的,当然也可以从Room的一方来保存Person,在Test.java中加入如下代码:,.Person person1=new Person();Person person2=new Person();Room room=new Room();person1.setName(李方方);person2.setName(王艳);Set persons=new HashSet();persons.add(person1);persons.add(perso
19、n2);room.setAddress(NJ-S1-328);room.setPerson(persons);/这样完成后,就可以通过Session对象/调用session.save(room)/会自动保存person1和person2.,4.3.3 一对多双向关联,运行程序,插入数据后,Person表和Room表的内容如图4.20、图4.21所示。,图4.20 Person表 图4.21 Room表,4.3.4 多对多关联,1.多对多单向关联学生和课程就是多对多的关系,一个学生可以选择多门课程,而一门课程又可以被多个学生选择。多对多关系在关系数据库中不能直接实现,还必须依赖一张连接表。如表4
20、.6、表4.7和表4.8所示。,表4.6 学生表student,表4.7 课程表course,表4.8 连接表stu_cour,4.3.4 多对多关联,由于是单向的,也就是说从一方可以知道另一方,反之不行。这里以从学生知道选择了哪些课程为例实现多对多单向关联。步骤如下:在项目Hibernate_mapping的org.model包下编写生成数据库表对应的Java类对象和映射文件。student表对应的POJO类如下:,package org.model;import;import;public class Student implements private int id;private St
21、ring snumber;private String sname;private int sage;private Set courses=new HashSet();/省略上述各属性的getter和setter方法student表与Student类的ORM映射文件。,4.3.4 多对多关联,course表对应的POJO如下:,package org.model;public class Course implements private int id;private String cnumber;private String cname;/省略上述各属性的getter和setter方法。,
22、4.3.4 多对多关联,course表与Course类的ORM映射文件 在文件中加入如下的配置映射文件的语句。,4.3.4 多对多关联,编写测试代码。在src文件夹下的包test的Test类中加入如下代码。,Course cour1=new Course();Course cour2=new Course();Course cour3=new Course();cour1.setCnumber(101);cour1.setCname(计算机基础);cour2.setCnumber(102);cour2.setCname(数据库原理);cour3.setCnumber(103);cour3.se
23、tCname(计算机原理);Set courses=new HashSet();courses.add(cour1);courses.add(cour2);courses.add(cour3);Student stu=new Student();stu.setSnumber(081101);stu.setSname(李方方);stu.setSage(21);stu.setCourses(courses);session.save(stu);/设置完成后就可以通过Session对象调用session.save(stu)完成持久化,4.3.4 多对多关联,运行程序,测试结果。因为该程序为Java
24、Application,所以可以直接运行。在完全没有操作数据库的情况下,程序就完成了对数据的插入。插入数据后,student表、course表及连接表stu_cour表的内容如图4.22、图4.23、图4.24所示。,图4.22 student表,图4.23 course表 图4.24 stu_cour表,4.3.4 多对多关联,2.多对多双向关联首先将其Course表所对应的POJO对象修改成如下代码:,package org.model;import;import;public class Course implements private int id;private String cn
25、umber;private String cname;private Set stus=new HashSet();/省略上述各属性的getter和setter方法,4.3.4 多对多关联,2.多对多双向关联Course表与Course类的ORM映射文件:,/指定参照course表的外键名称/指定参照student表的外键名称,36,Hibernate关联映射小结,多对一(一对多)单向关联:只需在“多”或“一”进行配置,双向一对多需要在“一”和“多”都进行配置,37,级联:通常用在一对多和一对一关联中,主动方对象执行操作时,被关联对象(被动方)是否同步执行同一操作。,38,inverse=tr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hibernate 应用 课堂

链接地址:https://www.31ppt.com/p-5433136.html