Hibernate学习之三(一对一关联)
原创
©著作权归作者所有:来自51CTO博客作者_温柔一刀的原创作品,请联系作者获取转载授权,否则将追究法律责任
今天我们来介绍下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的写法
测试:
下面我们来测试下查询
- **由此可见一对一立即加载. 默认使用左外连接查询
我们可以使用
one-to-one name=”idcard” class=”com.wfg.bean.Idcard” cascade=”all” fetch=”select”
这个里面配置 fetch=”select” 这样即可使用2个select语句查询
如果配置这个一般要配置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