一对一关系
l 情况1:主表的主键,与从表的外键(唯一),形成主外键关系
l 情况2:主表的主键,与从表的主键,形成主外键关系(从表的主键又是外键)
情况一:使用外键
case: Company:package com.hcx.domain;
public class Company {
private Integer id;
private String name;
private Address address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "Company [id=" + id + ", name=" + name + ", address=" + address
+ "]";
}
}
Address:
package com.hcx.domain;
public class Address {
private Integer id;
private String name;
private Company company;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
thispany = company;
}
@Override
public String toString() {
return "Address [id=" + id + ", name=" + name + "]";
}
}
Company.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hcx.domain" >
<class name="Company" table="t_Company" >
<id name="id" column="id" >
<generator class="native"></generator>
</id>
<property name="name" column="name" type="string" ></property>
<!-- 配置一对一
one-to-one : 默认使用主键同步策略完成一对一的表关系体现.
property-ref : 指定company在一对一关联时 ,指向哪个属性.
-->
<one-to-one name="address" class="Address" property-ref="company" > </one-to-one>
</class>
</hibernate-mapping>
Address.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hcx.domain" >
<class name="Address" table="t_Address" >
<id name="id" column="id" >
<generator class="native"></generator>
</id>
<property name="name" column="name" type="string" ></property>
<!--
unique : 唯一,外键唯一.
-->
<many-to-one name="company" class="Company" column="cid" unique="true" ></many-to-one>
</class>
</hibernate-mapping>
情况二:主键同步
case: Company.hbm.xml:<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hcx.domain" >
<class name="Company" table="t_Company" >
<id name="id" column="id" >
<generator class="native"></generator>
</id>
<property name="name" column="name" type="string" ></property>
<!-- 配置一对一
one-to-one : 默认使用主键同步策略完成一对一的表关系体现.
cascade:
fetch:
lazy:
-->
<one-to-one name="address" class="Address" > </one-to-one>
</class>
</hibernate-mapping>
Address.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hcx.domain" >
<class name="Address" table="t_Address" >
<id name="id" column="id" >
<!-- foreign: 该主键既是主键又是外键 -->
<generator class="foreign">
<!-- 作为外键时引用哪个属性 -->
<param name="property">company</param>
</generator>
</id>
<property name="name" column="name" type="string" ></property>
<!-- 配置一对一关系 -->
<one-to-one name="company" class="Company" constrained="true" ></one-to-one>
</class>
</hibernate-mapping>
Demo:
package com.hcx.b_secondcache;
import org.hibernate.Session;
import org.junit.Test;
import com.hcx.domain.Address;
import com.hcx.domain.Company;
import com.hcx.utils.HibernateUtils;
//一对一的操作
public class Demo {
@Test
//保存一对一数据
//注意: 在一对一使用外键时, 外键所在的对象才能维护关系. 另一方无法维护关系
public void fun1(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
Company company = new Company();
company.setName("传智播客");
Address addr = new Address();
addr.setName("金燕龙");
addr.setCompany(company);
session.save(company);
session.save(addr);
//------------------------------------------------
session.getTransaction()mit();
session.close(); // 游离状态
}
@Test
//查询一对一数据
//Hibernate查询一对一: 会使用表关联查询
public void fun2(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
Company company = (Company) session.get(Company.class, 1);
System.out.println(company);
//------------------------------------------------
session.getTransaction()mit();
session.close(); // 游离状态
}
}
更多推荐
Hibernate中表的一对一关系
发布评论