一对一关联关系映射(映射文件)
<one-to-one/>属性:
name:关联实体的属性名
class:该属性指定关联实体的全限定类名,通过反射得到该属性所属类的类名。
cascade:该属性指定哪些操作会从主表级联到子表记录。
constrained:该类对应的表和被关联的对象所对应的数据库表之间通过一个外键引用
对主键进行约束。这个选项影响save()和delete()在级联执行时的先后顺
序,以及决定该关联能否被委托(也在schema export tool中被使用)
fetch:该属性设置抓取策略,该属性接受join(外连抓取)和select(选择抓取)两个值
的其中之一。
property-ref:指定关联类的一个属性,这个属性将会和本类的主键相对应。如果没有
指定,默认使用对方关联类的主键。
access:指定Hibernate访问该关联属性的访问策略,默认是property
Lazy:指定引用关联实体的延迟加载特性,接受false,proxy,no-proxy三个值。
Hibernate实现一对一关联关系有两种方式:共享主键方式和唯一外键方式(就是通过设置<many-to-one../>的unique=”true”实现一对一映射)
基于主键的一对一关联映射
实现概述:
1、两个表的字段中没有对方引用
2、两个实体类中各自维护一个对方引用
3、让被控表的主键根据主控表的主键生成
4、在主控表中的<one-to-one .../>标签中设置cascade=”all” lazy=”false”
5、在被控表中的<one-to-one .../>标签中设置constrained=”true”
假如有两张表t_products(产品)和t_product_details(产品详细信息),这两张表通过各自的主键相连形成一对一的关系。如果要建立基于主键的一对一关联关系映射,两个实体Bean的映射文件都需要使用<one-to-one>进行映射。
建立t_products和t_product_details表
create table if not exists webdb.t_products(
id int(11) not null,
name varchar(30) not null,
PRIMARY key (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;
create table if not exists webdb.t_product_details(
id int(11) not null,
detail varchar(200) not null,
PRIMARY key (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;
对应的实体
public class Product {
private Integer id;
private String name;
private ProductDetail productDetail;
. . .
}
public class ProductDetail {
private Integer id;
private String detail;
private Product product;
. . .
}
对应的映射文件配置:
Product.hbm.xml:
<class name="org.hibernate.test.Product" table="t_products">
<id name="id" column="id" type="int">
<generator class="native"/>
</id>
<property name="name" column="name" type="string"/>
<!-- 用于映射关联实体,cascade=’all’表明主控类的所有操作,对关联类也执行同样操作,lazy=’false’表明此关联为立即加载 -->
<one-to-one name="productDetail" class="org.hibernate.test.ProductDetail" cascade="all" lazy=”false”/>
</class>
ProductDetail.hbm.xml
<class name="org.hibernate.test.ProductDetail" table="t_product_details">
<id name="id" column="id" type="int">
<generator class="foreign">
<!-- 采用foreign生成器指定该主键值将根据product属性引用的关联实体的主键来生成 -->
<param name="property">product</param>
</generator>
</id>
<property name="detail" column="detail" type="sring" />
<!--constrained表明当前表的主键上存在一个外键约束 -->
<one-to-one name="product" calss="org.hibernate.test.Product" constrained="true" />
</class>
基于外键的一对一关联映射
实现概述:
1、在主控表字段中设置一个被控表的引用,被控表不设置主控表的引用字段
2、两个实体类中各自维护一个对方引用
3、在主控表中的<many-to-one .../>标签中设置unique=”true” cascade=”all”
lazy=”false”
4、在被控表中的<one-to-one .../>标签中设置property-ref指定关联类的属性名
假如有两张表t_emloyees(员工表)和t_addresses(地址表),其中t_employees表的address_id字段和t_address表的id字段进行关联,形成一对一关系。
1、建立t_employees和t_address表
create table if not exists webdb.t_employees(
id int(11) not null,
name varchar(30) not null,
address_id int(11) not null,
PRIMARY key (id),
Unique key address_id (address_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;
create table if not exists webdb.t_addresses(
id int(11) not null,
address varchar(200) not null,
PRIMARY key (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;
2、对应的实体
public class Employee{
private Integer id;
private String name;
private Address address;
. . .
}
public class Address{
private Integer id;
private String address;
private Employee employee;
. . .
}
3、对应的映射文件配置:
Employee.hbm.xml:
<class name="org.hibernate.test.Employee" table="t_employees">
<id name="id" column="id" type="int">
<generator class="native"/>
</id>
<property name="name" column="name" type="string"/>
<!-- 用于映射关联实体 -->
<many-to-one name="address" class="org.hibernate.test.Address" column=”address_id” cascade="all"
unique=”true”/>
</class>
Address.hbm.xml
<class name="org.hibernate.test.Address" table="t_addresses">
<id name="id" column="id" type="int">
<generator class="intiva”/>
</id>
<property name="address" column="address" type="sring" />
<one-to-one name="employ" calss="org.hibernate.test.Employee" property-ref=”address”/>
</class>