1、创建两个实体(Company.java和Login.java)代码如下:
1 package wck.stu.vo.onetoonein; 2 3 public class Company { 4 private String id = ""; 5 6 private String companyName = ""; 7 8 private String linkman = ""; 9 10 private String telephone = "";11 12 private String email = "";13 14 private Login login;15 16 public String getId() {17 return id;18 }19 20 public void setId(String id) {21 this.id = id;22 }23 24 public String getCompanyName() {25 return companyName;26 }27 28 public void setCompanyName(String companyName) {29 this.companyName = companyName;30 }31 32 public String getLinkman() {33 return linkman;34 }35 36 public void setLinkman(String linkman) {37 this.linkman = linkman;38 }39 40 public String getTelephone() {41 return telephone;42 }43 44 public void setTelephone(String telephone) {45 this.telephone = telephone;46 }47 48 public String getEmail() {49 return email;50 }51 52 public void setEmail(String email) {53 this.email = email;54 }55 56 public Login getLogin() {57 return login;58 }59 60 public void setLogin(Login login) {61 this.login = login;62 }63 }
1 package wck.stu.vo.onetoonein; 2 3 public class Login { 4 private String id = ""; 5 6 private String loginName = ""; 7 8 private String loginPwd = ""; 9 10 private Company company;11 12 public String getId() {13 return id;14 }15 16 public void setId(String id) {17 this.id = id;18 }19 20 public String getLoginName() {21 return loginName;22 }23 24 public void setLoginName(String loginName) {25 this.loginName = loginName;26 }27 28 public String getLoginPwd() {29 return loginPwd;30 }31 32 public void setLoginPwd(String loginPwd) {33 this.loginPwd = loginPwd;34 }35 36 public Company getCompany() {37 return company;38 }39 40 public void setCompany(Company company) {41 this.company = company;42 }43 }
2、创建配置文件(Company.hbm.xml和Login.hbm.xml)代码如下:
1 2 56 7 258 119 10 12 1413 15 1716 18 2019 21 2322 24
注:<class>元素的lazy属性设定为true,表示延迟加载,如果lazy的值设置为false,则表示立即加载,下面对立即加载和延迟加载这两种概念进行说明。
(1)立即加载:表示Hibernate在从数据库中取得数据组装好一个对象(比如会员1)后,会立即再从数据库取得数据组装此对象所关联的对象(例如,登录帐号1)。
(2)延迟加载:表示Hibernate在从数据库中取得数据组装好一个对象(比如会员1)后,不会立即再从数据库取得数据组装此对象所关联的对象(例如,登录帐号1),而是等到需要时,才会从数据库取得数据组装此关联对象。
<one-to-one>元素的cascade属性标码操作是否 从父对象级联到被关联的对象all:所有情况下均进行级联操作,即包括save-update和delete操作。
<one-to-one>元素的fetch属性的可选值是join和select,默认值是select。当fetch属性设定为join时,表示链接抓取(Join Fetching):Hibernate通过在select语句中使用Outerjoin(外连接)来获得对象的关联实例或者关联集合。当fecth属性设定为select时,表示查询抓取(Select Fetching):需要另外发送一条select语句抓取当前对象的关联实体或集合。
1 2 56 7 208 129 company10 1113 1514 16 1817 19
注:Login.hbm.xml的主键id使用的外键生成机制(foreign),引用表company的主键作为login表的主键值,company在该映射文件的<one-to-one>元素的属性constrained="true"表示Login引用了company的主键作为外键。
3、测试代码
1 public String saveInfo() { 2 Company company = new Company(); 3 Login login = new Login(); 4 login.setLoginName("QQ"); 5 login.setLoginPwd("123"); 6 company.setCompanyName("清华大学出版社"); 7 company.setLinkman("白立军"); 8 company.setTelephone("010-60772015"); 9 company.setEmail("bailj@163.com");10 //PO对象之间相互设置关联关系11 login.setCompany(company); 12 company.setLogin(login); 13 return onettooneDaoImpl.saveInfo(company);14 }
实现多个表之间的主键一对一关系的时候只需要在主表(例如:Company.hbm.xml)中加入
<one-to-one name="login1" class="wck.stu.vo.onetoonein.Login1" cascade="all" fetch="join" outer-join="true" lazy="false"/>
其它一样,在保存的时候一定记得需要相互赋值例如:
1 public String saveInfo() { 2 Company company = new Company(); 3 Login login = new Login(); 4 login.setLoginName("QQ"); 5 login.setLoginPwd("123"); 6 Login1 login1 = new Login1(); 7 login1.setLoginName("QQ"); 8 login1.setLoginPwd("123"); 9 company.setCompanyName("清华大学出版社");10 company.setLinkman("白立军");11 company.setTelephone("010-60772015");12 company.setEmail("bailj@163.com");13 //PO对象之间相互设置关联关,注意这如果是多个表都需要相互赋值14 login.setCompany(company);15 login1.setCompany(company);16 company.setLogin(login);17 company.setLogin1(login1);18 return onettooneDaoImpl.saveInfo(company);19 }