
Hibernate应用课堂.ppt
119页Hibernate关系映射1₪在面向对象设计和实体模型关系中,对象间关系 一般包括4种:一对一(one-to-one)、一对多 (one-to-many)、多对一(many-to-one)、 多对多(many-to-many) ₪对象是现实世界中具有唯一性的事物 ₪一对一关联类型 :主键关联与唯一外键关联 ₪一对一的主键关联形式是两张关联表通过主键形 成一对一映射关系 ₪唯一外键关联是两张表的主键值不同,使用一个 新添加的字段来作为外键维持一对一关系 ₪单向一对多只需在“一”的一方进行配置,反之就 是单向多对一 ₪双向一对多就是对单向一对多的一种改进24.3 Hibernate关系映射₪ 4.3.1 一对一关联 ₪ 1. 共享主键方式 ₪ 在注册某个论坛会员的时候,往往不但要填写登录账号 和密码,还要填写其他的详细信息,这两部分信息通常 会放在不同的表中,如表4.1、表4.2所示 字 段 名 称数 据 类 型主 键自 增允 许 为 空描 述IDint(4)是ID号USERNAMEvarchar(20)登录账 号PASSWORDvarchar(20)登录密码字 段 名 称数 据 类 型主 键自 增允 许 为 空描 述IDint(4)是增1ID号TRUENAMEvarchar(8)是真实姓名EMAILvarchar(50)是电子邮件表4.1 登录表Login表4.2 详细信息表Detail34.3.1 一对一关联₪ 登录表和详细信息表属于典型的一对一关联关系,可按 共享主键方式进行。
步骤如下: ₪ ① 创建Java项目,命名为“Hibernate_mapping” ₪ ② 添加Hibernate开发能力,步骤同4.2.1节第4步 HibernateSessionFactory类同样位于org.util包下 ₪ ③ 编写生成数据库表对应的Java类对象和映射文件 ₪ Login表对应的POJO类Login.java:package org.model; public class Login implements java.io.Serializable{private int id; // ID号 private String username; // 登录账号private String password; // 密码private Detail detail; // 详细信息// 省略上述各属性的getter和setter方法 }44.3.1 一对一关联₪Detail表对应的Detail.java:package org.model; public class Detail implements java.io.Serializable{private int id; // ID号private String trueName; // 真实姓名private String email; // 电子邮件private Login login; // 登录信息// 省略上述各属性的getter和setter方法 }54.3.1 一对一关联₪ Login表与Login类的ORM映射文件Login.hbm.xml。
table=“login“>detaildetail >“>“>64.3.1 一对一关联₪ Detail表与Detail类的ORM映射文件Detail.hbm.xml:“ table=“detail“>“>“>namename表示属性名字,表示属性名字,classclass表表 示被关联的类的名字示被关联的类的名字 cascade=“all”cascade=“all”表明主控类的表明主控类的 所有操作,对关联类也执行同所有操作,对关联类也执行同 样操作样操作 lazy=“false“lazy=“false“表示此关联为立表示此关联为立 即加载即加载74.3.1 一对一关联₪ ④ 在hibernate.cfg.xml文件中加入配置映射文件的语句₪ ⑤ 创建测试类 ₪ 在src文件夹下创建包test,在该包下建立测试类 “Test.java”………… Session Session sessionsession= =HibernateSessionFactory.getSessionHibernateSessionFactory.getSession();(); Transaction Transaction tsts= =session.beginTransactionsession.beginTransaction(); // (); // 创建事务对象创建事务对象 Detail Detail detaildetail=new Detail();=new Detail(); Login Login loginlogin=new Login();=new Login(); login.setUsername(“yanhonglogin.setUsername(“yanhong“);“); login.setPassword(“123“);login.setPassword(“123“); detail.setTrueNamedetail.setTrueName(“(“严红严红“);“); detail.setEmail(“yanhong@“);detail.setEmail(“yanhong@“); // //相互设置关联相互设置关联 login.setDetail(detail); detail.setLogin(login); // //这样完成后就可以通过这样完成后就可以通过SessionSession对象调用对象调用session.save(detailsession.save(detail) )来持久化该对象来持久化该对象 session.save(detailsession.save(detail); ); mit();(); HibernateSessionFactory.closeSessionHibernateSessionFactory.closeSession();(); …………84.3.1 一对一关联₪ ⑥ 运行程序,测试结果。
₪ 因为该程序为Java Application,所以可以直接运行在 完全没有操作数据库的情况下,程序就完成了对数据的 插入插入数据后,Login表和Detail表的内容如图4.12 、图4.13所示图4.12 Login表 图4.13 Detail表94.3.1 一对一关联₪ 2. 唯一外键方式 ₪ 唯一外键的情况很多,例如,每个人对应一个房间其 实在很多情况下,可以是几个人住在同一个房间里面, 就是多对一的关系但是如果把这个多变成唯一,也就 是说让一个人住一个房间,就变成了一对一的关系了, 这就是前面说的一对一的关系其实是多对一关联关系的 一种特殊情况对应的Person表和Room表如表4.3、表 4.4所示字 段 名 称数 据 类 型主 键自 增允 许 为 空描 述Idint是增1ID号namevarchar(20)姓名room_idint(20)是房间号字 段 名 称数 据 类 型主 键自 增允 许 为 空描 述idint(4)是增1ID号addressvarchar(100)地址表4.3 Person表表4.4 Room表104.3.1 一对一关联₪ 步骤如下: ₪ ① 在项目Hibernate_mapping的org.model包下编写生成 数据库表对应的Java类对象和映射文件。
Person表对应的POJO类Person.java: package org.model; public class Person implements java.io.Serializable { private Integer id; private String name; private Room room; // 省略上述各属性的getter和setter方法 } Room表对应的POJO类Room.java: package org.model; public class Room implements java.io.Serializable{ private int id; private String address; private Person person; // 省略上述各属性的getter和setter方法 }114.3.1 一对一关联₪ Person表与Person类的ORM映射文件Person.hbm.xml :// 唯一性约束,实现一对一124.3.1 一对一关联₪ Room表与Room类的ORM映射文件Room.hbm.xml:// 指定关联类的属性名134.3.1 一对一关联₪ ② 在hibernate.cfg.xml文件中加入如下的配置映射文件 的语句。
₪ ③ 编写测试代码在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); …144.3.1 一对一关联₪ ④ 运行程序,测试结果 ₪ 因为该程序为Java Application,所以可以直接运行在 完全没有操作数据库的情况下,程序就完成了对数据的 插入插入数据后,Person表和Room表的内容如图 4.14、图4.15所示图4.14 Person表 图4.15 Room表154.3.2 多对一单向关联₪ 只要把上例中的一对一的唯一外键关联实例稍微修改就可以变 成多对一步骤如下: ₪ ① 在项目Hibernate_mapping的org.model包下编写生成数据库 表对应的Java类对象和映射文件其对应表不变,Person表对 应的类也不变,对应的Person.hbm.xml文件修改如下:// 主控类所有操作,对关联类也执行同样操作164.3.2 多对一单向关联₪ 而Room表不变,对应的POJO类如下:₪ Room表与Room类的ORM映射文件Room.hbm.xml如下:package org.model; public class Room implements java.io.Serializable{ private int id; private String address; // 省略上述各属性的getter和setter方法 }174.3.2 多对一单向关联₪② 编写测试代码。
₪在src文件夹下的包test的Test类中加入如下代码 :… Room room=new Room(); room.setAddress(“NJ-S1-328“); Person person=new Person(); person.setName(“liuyanmin“); person.setRoom(roo。
