收藏 分销(赏)

hibernate映射关系PPT.ppt

上传人:丰**** 文档编号:7434847 上传时间:2025-01-04 格式:PPT 页数:49 大小:519KB 下载积分:12 金币
下载 相关 举报
hibernate映射关系PPT.ppt_第1页
第1页 / 共49页
hibernate映射关系PPT.ppt_第2页
第2页 / 共49页


点击查看更多>>
资源描述
,Title Holder,*,加拿大,亚思晟,(,中国)公司,CONFIDENTIAL,hibernate,映射关系,中国北京:,电话:(,010,),82780848/62969799,地址:北京市海淀区创业中路,36,号,留学人员创业园,306,室,目标,Hibernate,映射关系,单向多对一,cascade,级联及,lazy,惰性加载,单向一对多,双向关联,inverse,的意义,一对一,多对多,单向多对一,多对一,一个简单的多对一关系,例如在學校宿舍中,,使用者,与,房间,的关系就是多對一的关,多,个使用者可以居住同一个房间。(或者,人员,部门,之间的关系),多对一,room_id,让使用者与房间建立关系,您可以如下建立,user,与,room,表格:,CREATE TABLE user(id INT(11)NOT NULL auto_increment PRIMARY KEY,name VARCHAR(100)NOT NULL,room_id INT(11);CREATE TABLE room(id INT(11)NOT NULL auto_increment PRIMARY KEY,address VARCHAR(100)NOT NULL,);,建立外键关系:,alter table hibmanytoone.user add foreign key FK_user_room(room_id)references room(id),多对一,持久化类,User,类:,private Integer id;,private String name;,private Room room;,User,类中有一,room,属性,將參考至,Room,实例,多個,User,实例可共參考一個,Room,实例。,Room,类:,private Integer id;,private String address;,多对一,映射文件结构:,多对一,映射文件:,Room.hbm.xml,多对一,映射文件:,User.hbm.xml,多对一,保存与加载测试,Room room=new Room();,room.setAddress(101);,/,没有级联操作时 如果不保存,room,,就会报,object references an unsaved transient instance,/session.save(room);,不保存和保存的区别,cascade,使用?,User user1=new User();,user1.setName(,张三,);,user1.setRoom(room);,User user2=new User();,user2.setName(,李四,);,user2.setRoom(room);,session.save(user1);session.save(user2);,Cascade,的意义,级联操作:,在,Hibernate,中是以映射文件中标签上的,cascade,属性来设置,预设是,none,,之外还有:,all,、,save-update,和,delete,。,以,多對一,中的例子来说,如果不設定,cascade,为,all,,则必须分别对,User,实例和,Room,实例都进行储存操作:,Room room=new Room();room.setAddress(101);,User user1=new User();user1.setName(“,张三,”);user1.setRoom(room);,User user2=new User();user2.setName(“,李四,”);user2.setRoom(room);Session session=sessionFactory.openSession();Transaction tx=session.beginTransaction();,/,存储,Room,实例,session.save(room);,/,存储用户实例,session.save(user1);session.save(user2);mit();session.close();,多对一,加载,(,惰性加载,lazy,:只有使用对象属性时候才发送,sql,取得对象,,load,?,Lazy,可以设置在,标签中对普通属性起作用,设置在,标签加载关联集合,),User user=new IUserDAOImpl().findUserById(1);,System.,out,.println(user.getName();,System.,out,.println(user.getRoom().getAddress();,惰性加载,单向一对多,一对多,在多对一中,,User,对,Room,是多对一的关系,,User,实例来维护,Room,实例,如果將这个关系反过来,由,Room,实例维护,User,实例,就是一对多的关系。,User,类:,private Integer id;,private String name;,Room,类:,private Integer id;,private String address;,private Set users;,这种方式即所谓单向一对多关系,也就是,Room,实例知道,User,实例的存在,而,User,不知道,Room,实例。(在前面多对一中,是单向多对一,即,User,知道,Room,的存在,但,Room,不知道,User,的存在。),一对多,映射文件,User.hbm.xml,一对多,映射文件,Room.hbm.xml,一对多,存储实例,User user1=new User();,user1.setName(“111);,User user2=new User();,user2.setName(“222);,Room room1=new Room();,room1.setUsers(new HashSet();,room1.setAddress(“1-101);,room1.getUsers().add(user1);,room1.getUsers().add(user2);,/,当,Room.hbm.xml,中,set,集合没有配置,cascade=“all“,存储报异常:,/object references an unsaved transient instance user1,、,user2,是临时对象,new IRoomDAOImpl().saveRoom(room1);,可以查看库的存储情况,,也可以练习加载,Room,对象从而得到关联的,User,集合。,多对一、一对多双向关联,一对多 多对一 双向关联,前面多对一、一对多 中都是单向关联,也就是其中一方关联到另一方,而另一方,不知道自己被关联。如果让双方都意识到另一方的存在,這就形成了,双向关联,User,类:,private Integer id;,private String name;,private Room room;,Room,类:,private Integer id;,private String address;,private Set users=new HashSet();,一对多 多对一 双向关联,User.hbm.xml,一对多 多对一 双向关联,Room.hbm.xml,一对多 多对一 双向关联,这样在做存储操作时候,双方都可以。存储任意一方,另一方都会关联被执行。,但是注意两种情况的,sql,打印?,User user1=new User();,user1.setName(“111);,User user2=new User();,user2.setName(“222);,Room room=new Room();,room.setUsers(new HashSet();,room.setAddress(“1-001);,room.getUsers().add(user1);,room.getUsers().add(user2);,/Room.hbm.xml,的,set,集合中必须添加,cascade,否则报,object references an unsaved transient instance,异常 使用了,user1,、,user2,临时对象,new IRoomDAOImpl().saveRoom(room);,一对多 多对一 双向关联,这样有個效率可以探討,上面的程式片段,Hibernate,將使用以下的,SQL,進行儲存,Hibernate:insert into room(address)values(?)Hibernate:insert into user(name,room_id)values(?,?)Hibernate:insert into user(name,room_id)values(?,?)Hibernate:update user set room_id=?where id=?Hibernate:update user set room_id=?where id=?,上面的程式表示关联由,Room,單方面維持,而主控方也是,Room,,,User,不知道,Room,的,room_id,是多少,所以必須分別儲存,Room,與,User,之後,再更新,user,的,room_id,。,一对多 多对一 双向关联,inverse,控制反转,在一對多、多對一形成双向关联的情況下,可以將关联维护的控制权交給多的一方,这样效率会好点,理由不难理解,就像是在公司中,老板要記住多個員工的姓名快,还是每一個員工都記得老板的姓名快。,所以在一對多、多對一形成双向关联的情況下,可以在一的一方設定控制权反转,也就是當儲存一的一方時,將关联维持的控制权交給多的一方,以上面的例子來說,可以設定,Room.hbm.xml,:,。,一对多 多对一 双向关联,inverse,控制反转,由于关联的控制權交給多的一方了,所以直接儲存一方前,多的一方必須意识到一的存在,所以程式片段必須改為如下:,User user1=new User();,user1.setName(“1111);,User user2=new User();,user2.setName(“2222);,Room room=new Room();,room.setUsers(new HashSet();,room.setAddress(“1-001);,room.getUsers().add(user1);,room.getUsers().add(user2),;,接下,一对多 多对一 双向关联,/,多方必須意识到单的一方的存在,因为存储,Room,时候,控制权会交给,User,user1.setRoom(room);,user2.setRoom(room);,new IRoomDAOImpl().saveRoom(room1);,上面执行后打印以下的,SQL,:,Hibernate:insert into room(address)values(?),Hibernate:insert into user(room_id,name)values(?,?),Hibernate:insert into user(room_id,name)values(?,?),没有了,update,更新的操作了。,如果控制权交給另一方了,而另一方沒有意识到对方的存在的话会如何?,试着將上面的红色代码去掉,执行后,会发现表中,room_id,会出現,null,值,結果就好比在 多對一中,沒有分配給,User,一個,Room,,那么,room_id,會出現,null,单向一對一(唯一外键关联),一對一(唯一外键关联),現在考虑每一個,User,分配一间,Room,,形成一對一,,user,表格通过,room_id,作为外键參考至,room,(即将原来的多对一设置成,unique,对应关系),User,类:,private Integer id;,private Room room;,private String name;,Room,类:,private Integer id;,private String address;,private User user;,一對一(唯一外键关联),使用外键來完成一對一,其实就是限制多对一关系中,多的一方只能有一個參考至一的一方,可以在映射文件中使用,标签時,加上,“unique”,属性来设定,User.hbm.xml,一對一(唯一外键关联),Room.hbm.xml,到此为止,单向一对一的映射已經完成,然后做保存和加载查询测试,双向一對一(唯一外键关联),双向一對一(唯一外键关联),双向一对一(唯一外键关联):,如果要再完成双向一對一的关系,則可以在,Room.hbm.xml,中使用,标签來定义,在,中,,property-ref,告訴,Hibernate,,查詢出,user,并将其关联至,room,(,User,类对象中的,room,属性),然后测试双向关联的存储和查询操作。,双向一對一(唯一外键关联),测试,Room room1=new Room();,room1.setAddress(N101fff);,Room room2=new Room();,room2.setAddress(N102fff);,User user1=new User();,user1.setName(,张三,2fff);,user1.setRoom(room1);,User user2=new User();,user2.setName(,王五,2fff);,user2.setRoom(room2);,session.save(user1);session.save(user2);,一對一(主键关联约束),一對一(主键关联约束),一對一关联的另一种方式,是限制两个实体的主键必須一致,这样直接通过两个表格的主鍵就可确定一對一关系,而不用额外的外键参考。,一對一(主键关联约束),CREATE TABLE user1(id INT(11)NOT NULL auto_increment PRIMARY KEY,name VARCHAR(100)NOT NULL default);CREATE TABLE room1(id INT(11)NOT NULL auto_increment PRIMARY KEY,address VARCHAR(100)NOT NULL default);,一對一(主键关联约束),User1,类:,private Integer id;,private Room1 room1;,private String name;,Room1,类:,private Integer id;,private String address;,private User1 user1;,一對一(主键关联约束),User1.hbm.xml,一對一(主键关联约束),Room1.hbm.xml,user1,一對一(主键关联约束),在,Room1,的,id,主键上,使用,foreign,表示与外键共享主键,也就是与,User1,实体共享主鍵,而,constrained,設定为,true,,表示約束,room1,的主键必須与,user1,中对应资料的主键相同。,Room1 room1=new Room1();,room1.setAddress(N101);,User1 user1=new User1();,user1.setName(,张三,);,/,互相設定关系,user1.setRoom1(room1);,room1.setUser1(user1);,session.save(user1);,多对多,多对多,在表上要进行多对多关联,可以由一个中间表來完成,也就是可以转换为由多對一、一對多來完成多对多关联。,多对多,CREATE TABLE user(id INT(11)NOT NULL auto_increment PRIMARY KEY,name VARCHAR(100)NOT NULL default);CREATE TABLE user_server(user_id INT(11),server_id INT(11);CREATE TABLE server(id INT(11)NOT NULL auto_increment PRIMARY KEY,address VARCHAR(100)NOT NULL default);,多对多,User.java,private Integer id;,private String name;,private Set servers=new HashSet(0);,Server.java,private Integer id;,private String address;,private Set users=new HashSet(0);,多对多,User.hbm.xml,多对多,Server.hbm.xml,多对多,测试,Server server1=new Server();,server1.setAddress(PC-219);,Server server2=new Server();,server2.setAddress(PC-220);,User user1=new User();,user1.setName(“,张三,);,User user2=new User();,user2.setName(“,李四,);,多对多,测试,/,多對多,互相參考,user1.getServers().add(server1);,user1.getServers().add(server2);,user2.getServers().add(server1);,user2.getServers().add(server2);,server1.getUsers().add(user1);,server1.getUsers().add(user2);,server2.getUsers().add(user1);,server2.getUsers().add(user2);,server3.getUsers().add(user2);,session.save(user1);,session.save(user2);,Thank You!,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服