今天我们来介绍下hibernate的关联关系中的一对一关联:
一对一关联的实现方式有2种:
主键关联:主键关联即主表id和关联表id一致
外键关联:外键关联即主表id做关联表的外键,但是要求外键唯一性,也就是说一对多的一种个例,也就是说多的一方,仅有一个;

主键关联

主键关系的一对一
外键表的主键又是主键表的外键.
实体类:相互有对方的实体类.
People 类

public class People implements java.io.Serializable {

// Fields

private Integer id;
private String name;
private Idcard idcard;

Idcard 类

public class Idcard implements java.io.Serializable {

// Fields

private Integer id;
private People people;
private String number;

映射文件

<hibernate-mapping>
<class name="com.wfg.bean.People" table="people" catalog="onetoone">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="15" />
</property>
<one-to-one name="idcard" class="com.wfg.bean.Idcard" cascade="all" ></one-to-one>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.wfg.bean.Idcard" table="idcard" catalog="onetoone">
<id name="id" type="java.lang.Integer" column="ID">
<generator class="foreign"> <!-- 用外键策略 -->
<!-- 固定写法,意思即是这个主键值根据谁的主键获得 -->
<param name="property">people</param>
</generator>
</id>
<one-to-one name="people" class="com.wfg.bean.People"></one-to-one>
<property name="number" type="java.lang.String">
<column name="NUMBER" length="15" />
</property>
</class>
</hibernate-mapping>

注意id的写法

测试:

Hibernate学习之三(一对一关联)_一对一-映射


下面我们来测试下查询

Hibernate学习之三(一对一关联)_java_02

  1. **由此可见一对一立即加载. 默认使用左外连接查询
    我们可以使用
    one-to-one name=”idcard” class=”com.wfg.bean.Idcard” cascade=”all” fetch=”select”
    这个里面配置 fetch=”select” 这样即可使用2个select语句查询
    如果配置这个一般要配置2个映射文件,至于为什么自己验证下,很容易发现;**
  2. 一对一默认使用的是立即加载,如果需要使用延迟
    加载,那么需要在 one-to-one 元素中将 constrained 属性设为
    true,并且将待加载的一方的 class 元素中的lazy属性设为 true
    (或者不去设置,因为该属性默认值就是 true)

外键关联

本质上是一对多的蜕化形式。在 many-to-one 元素中增加unique=”true”属性就变成了一对一

实体类和主键关联一样不再赘述;
映射文件:
people的映射文件也一样 只用idcard的映射文件不一样:

<hibernate-mapping>
<class name="com.wfg.bean1.Idcard" table="idcard1" catalog="onetoone">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<!-- 这里虽然是多对一 但是加了唯一约束 -->
<many-to-one name="people" class="com.wfg.bean1.People" fetch="select" unique="true">
<column name="people_ID" not-null="true" />
</many-to-one>
<property name="number" type="java.lang.String">
<column name="NUMBER" length="15" />
</property>
</class>
</hibernate-mapping>

测试也一样这里都不赘述了再;
简单粗暴直接上源码:
链接:​​​http://pan.baidu.com/s/1c204DFi​​ 密码:polz