`

Hibernate 一对一关联映射(主键关联VS唯一外键关联)

阅读更多
一对一关联映射有两种:一种是主键关联,一种是“唯一”外键关联。
主键关联:原理是两张表的主键(ID)保持一致,在获取的时候根据两种表中的ID相同来作为关系判断的标准,这样的设计好处在于我们不用添加另外的字段来维护它们之间的关系。
废话少说,看例子。
在生活一对一的关系还“算”挺多的,比如人与自己的省份证,丈夫和妻子(当然是在符合中国国情的情况下)等等。
第一步:建立两张表。
TABLE:husband
create table husband(
h_id int primary key,
h_name varchar(20)
);

TABLE:wife
create table wife(
w_id int primary key,
w_name varchar(20)
);

注意:这两张表没有使用外键来关联它们。
第二步:建立PO对象。
JAVA PO :HusbandPO.java
package com.lovo.po;
public class HusbandPO {
  private int id;
	
  private String name;
	
  private WifePO myWife; //注意包含了一个妻子对象

  ... other getXX setXX ...
}

JAVA PO :WifePO.java
package com.lovo.po;
public class WifePO {
  private int id;
	
  private String name;
	
  private HusbandPO myHus; //注意包含了一个丈夫对象

  ... other getXX setXX ...
}

第三步:在XX.hbm.xml中配置PO对象属性与数据库表字段的映射。
HusbandPO.hbm.xml

 <hibernate-mapping>
	<!-- 主控方 -->
	<class name="com.lovo.po.HusbandPO" table="husband">
		<id name="id" column="h_id" type="int">
			<generator class="increment"></generator>
		</id>
		<property name="name" column="h_name" type="string"></property>
		<!-- cascade的作用是当本身发生修改的时候,会级联的修改从表 -->
		<one-to-one name="myWife" class="com.lovo.po.WifePO" cascade="all"></one-to-one>
	</class>
</hibernate-mapping>

WifePO.hbm.xml

 <hibernate-mapping>
	<class name="com.lovo.po.WifePO" table="wife" >
		<id name="id" column="w_id" type="int">
			<generator class="foreign">
				<!-- 引用husband表的主键 -->
				<param name="property">myHus</param>
			</generator>
		</id>
		<property name="name" column="w_name" type="string"></property>
		<one-to-one name="myHus" class="com.lovo.po.HusbandPO"  cascade="all"></one-to-one> 
	</class>
</hibernate-mapping>


唯一外键映射:记住是“唯一”,因为一对一是多对一的一种特例,且在hibernate-mapping中是利用<many-to-one>来表示,这个时候需要指明该标签的unique="true",这才算是一对一,否则就是多对一。
例子还是使用上面的一一制夫妻关系。
第一步:只需要在两张表的其中一张中加上一个外键,我这里在wife身上加(没有别的意思 )。
TABLE:husband
create table husband(
h_id int primary key,
h_name varchar(20)
);

TABLE:wife
create table wife(
w_id int primary key,
w_name varchar(20),
fk_hus_id int foreign key(fk_hus_id) 
references husband(h_id)
);

第二步:上面是写PO ,这里也不例外,不过PO对象没有改变过哈,这里不复写了。
第三步:XX.hbm,xml配置,配置与上面有所区别,注意啦……
HusbandPO.hbm.xml
<hibernate-mapping> 
	<class name="com.lovo.po.HusbandPO" table="husband">
		<id name="id" column="h_id" type="int">
			<generator class="increment"></generator>
		</id>
		<property name="name" column="h_name" type="string"></property> 
		<one-to-one name="myWife" class="com.lovo.po.WifePO"
		property-ref="myHus" cascade="all"></one-to-one>
		<!-- property-ref 被关联到此外键的类中的对应属性的名字,若没指定,使用被关联类的主键.由于这里是唯一外键关联,所以一般要设置这里。(这里相当于是在说我妻子的老公是我,从而我妻子的结婚证编号和我的结婚证编号是一样的)  -->
	</class>
</hibernate-mapping>


WifePO.hbm.xml
<hibernate-mapping>
	<class name="com.lovo.po.WifePO" table="wife" >
		<id name="id" column="w_id" type="int">
			<!-- 注意!这里的ID不在是引用husband表的ID了 -->
			<generator class="increment"></generator>
		</id>
		<property name="name" column="w_name" type="string"></property>
		<many-to-one name="myHus" class="com.lovo.po.HusbandPO"  cascade="all"
		unique="true" column="fk_hus_id"></many-to-one> 
		<!-- 这里是要表示一对一所以“unique="true"”是不可缺少的。column指明数据库表的外键字段 -->
	</class>
</hibernate-mapping>
2
3
分享到:
评论

相关推荐

    Hibernate关联映射

    Hibernate 一对一外键单向关联 Hibernate 一对一主键单向关联 Hibernate 一对一连接表单向关联 Hibernate 一对多外键单向关联 Hibernate 一对多连接表单向关联 Hibernate 多对一外键单向关联 Hibernate 多对一连接...

    Hibernate关联关系映射目录

    Hibernate关联关系映射 单向关联 │ ├─ 一对一外键单向关联 │ ├─ 一对一主键单向关联 │ ├─ 一对一连接表单向关联 │ ├─ 一对多外键单向关联 │ ├─ 一对多连接表单向关联 │ ├─ 多对一外键单向关联 │ ...

    Hibernate学习笔记

    011 一对一 唯一外键关联映射_单向 012 一对一 唯一外键关联映射_双向 013 session_flush 014 一对多关联映射 单向 015 一对多关联映射 双向 016 多对多关联映射 单向 017 多对多关联映射 双向 018 关联映射文件中...

    hibernate学习笔记

    hibernate多对一关联映射(Hibernate_Many2One) 7 hibernate一对一主键关联映射(单向关联Person----&gt;IdCard) 8 hibernate一对一主键关联映射(双向关联Person&lt;----&gt;IdCard) 9 hibernate一对一唯一外键关联映射...

    Hibernate_Annotation关联映射

    其中一个实体通过外键关联到另一个实体的主键(注意要模拟一对一关联必须在外键列上添加唯一约束),(3).通过关联表来保存两个实体之间的连接关系(要模拟一对一关联必须在每一个外键上添加唯一约束)。 1.共享主键的...

    Hibernate_实体关联关系映射--学习总结

    Hibernate 实体关联关系映射 学习总结 把一对一 一对多 单向 双向 主键 外键 链接表等讲的比较清楚

    Java的Hibernate框架中的双向主键关联与双向外键关联

    Hibernate想要实现双向的关联就必须在映射文件的两端同时配置,另外还要在主映射的一端采用foreign外键关联属性,下面我们就一起来看一下Java的Hibernate框架中的双向主键关联与双向外键关联方法:

    Hibernate实体映射

    :Hibernate有两种映射实体一对一关联关系的实现方式:共享主键方式和唯一外键方式。 共享主键方式: 所谓共享主键方式就是限制两个数据表的主键使用相同的值

    Hibernate高级映射实例

    Hibernate高级映射的几个单向关系,单向一对一(共享主键方式、唯一外键方式),单向多对一,单向一对多,单向多对多。

    Hibernate学习笔记_songjignhao_1

    自己记录的学习笔记,内容很详细,有代码,包括:一对多双向关联关系、一对多双向自身关联关系、一对一关联关系(主键关联、外键关联)、一对多与一对一结合、多对多关联关系、Map、Set、List与Bag映射关系、查询...

    传智播客李勇hibernate源码1-20课

    14_多对一关联关系的映射与原理分析 15_多对一关联关系的检索与原理分析 16_保存多对一关联关系的更进一步分析 17_一对多关联关系的映射与原理分析 18_一对一主键关联关系的映射与原理分析 19_一对一主键关联...

    Hibernate注解

    * @ManyToOne 设置多对一关联 * 方法一 * @ManyToOne(cascade={CasCadeType.PERSIST,CascadeType.MERGE}) * @JoinColumn(name="外键") * public 主表类 get主表类(){return 主表对象} * 方法二 * @ManyToOne...

    hibernate的中所有关系映射(分别用xml和jpa实现)

    hibernate的中关系映射分为一对一、一对多、多对一、多对多,其中有单双向之分。而一对一还有主键和外键区分。一共是九种。分别用xml配置文件和annotation实现。annotation的版本没有写测试程序,见谅。

    Hibernate注释大全收藏

    映射主键属性 @Id 注解可将实体Bean中某个属性定义为主键,使用@GenerateValue注解可以定义该标识符的生成策略。 • AUTO - 可以是 identity column, sequence 或者 table 类型,取决于不同底层的数据库 • TABLE ...

    Hibernate Annotations 中文文档

    映射主键属性 2.2.4. 映射继承关系 2.2.4.1. 每个类一张表 2.2.4.2. 每个类层次结构一张表 2.2.4.3. 连接的子类 2.2.4.4. 从父类继承的属性 2.2.5. 映射实体Bean的关联关系 2.2.5.1. 一对一(One-to-one) 2.2...

    hibernate annotation 中文文档

    映射主键属性 2.2.4. 映射继承关系 2.2.4.1. 每个类一张表 2.2.4.2. 每个类层次结构一张表 2.2.4.3. 连接的子类 2.2.4.4. 从父类继承的属性 2.2.5. 映射实体Bean的关联关系 2.2.5.1. 一对一(One-to-one) 2.2.5.2. ...

    hibernate annotation帮助文档

    映射主键属性 2.2.4. 映射继承关系 2.2.4.1. 每个类一张表 2.2.4.2. 每个类层次结构一张表 2.2.4.3. 连接的子类 2.2.4.4. 从父类继承的属性 2.2.5. 映射实体Bean的关联关系 2.2.5.1. 一对一(One-to-one) 2.2...

    Hibernate3.1_学习源码

    案例目录: 01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了...07 07Hibernate_Mapping : Hibernate中的数据关联技术,是一个重点又是一个难点,演示了 一对一、多对一、一对多、多对多等几种情况。

Global site tag (gtag.js) - Google Analytics