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 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <class name="wck.stu.vo.onetoonein.Company" table="COMPANY"> 7 <id name="id" type="java.lang.String"> 8 <column name="C_ID" length="32" not-null="true"></column> 9 <generator class="uuid.hex"></generator> 10 </id> 11 <property name="companyName" type="java.lang.String"> 12 <column name="C_COMPANYNAME" length="17"></column> 13 </property> 14 <property name="linkman" type="java.lang.String"> 15 <column name="C_LIKEMAN" length="17"></column> 16 </property> 17 <property name="telephone" type="java.lang.String"> 18 <column name="C_TELEPHONE" length="17"></column> 19 </property> 20 <property name="email" type="java.lang.String"> 21 <column name="C_EMAIL" length="170"></column> 22 </property> 23 <one-to-one name="login" class="wck.stu.vo.onetoonein.Login" cascade="all" fetch="join" outer-join="true" lazy="false"/> 24 </class> 25 </hibernate-mapping>
注:<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 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <class name="wck.stu.vo.onetoonein.Login" table="LOGIN"> 7 <id name="id" type="java.lang.String" column="C_ID"> 8 <generator class="foreign"> 9 <param name="property">company</param> 10 </generator> 11 </id> 12 <property name="loginName" type="java.lang.String"> 13 <column name="C_LOGINNAME" length="17"></column> 14 </property> 15 <property name="loginPwd" type="java.lang.String"> 16 <column name="C_LOGINPWD" length="17"></column> 17 </property> 18 <one-to-one name="company" class="wck.stu.vo.onetoonein.Company" constrained="true"/> 19 </class> 20 </hibernate-mapping>
注: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 }