Hibernate一对一 主键关联映射(one-to-one)
2015-05-31 18:36
555 查看
*两个对象之间是一对一的关系,如Person-IdCard(人-***号)
*有两种策略可以实现一对一的关联映射
》主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应关系;数据库不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
》唯一外键关联:外键关联本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联映射
对象模型:
IdCard实体类:
[html]
view plaincopy
public class IdCard {
private int id;
private String cardNo;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
}
Person实体类:
[html]
view plaincopy
public class Person {
private int id;
private String name;
private IdCard idCard;//持有IdCard对象的引用
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
}
}
IdCard实体映射文件:
[html]
view plaincopy
<hibernate-mapping>
<class name="com.cn.hibernate.IdCard" table="t_idcard">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
Person实体映射文件:
[html]
view plaincopy
<hibernate-mapping>
<class name="com.cn.hibernate.Person" table="t_person">
<id name="id" column="id">
<!--
因为主键不是自己生成的,而是作为一个外键(来源于其它值),所以使用foreign生成策略
foreign:使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用。
再使用元素<param>的属性值指定相关联对象(这里Person相关联的对象为idCard,则标识符为idCard的id)为了能够在加载person数据同时加载IdCard数据,所以需要使用一个标签<one-to-one>来设置这个功能。
-->
<generator class="foreign">
<!-- 元素<param>属性name的值是固定为property -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<!-- <one-to-one>标签
表示如何加载它的引用对象(这里引用对象就指idCard这里的name值是idCard),同时也说是一对一的关系。
默认方式是根据主键加载(把person中的主键取出再到IdCard中来取相关IdCard数据。)
我们也说过此主键也作为一个外键引用 了IdCard,所以需要加一个数据库限制(外键约束)constrained="true"
-->
<one-to-one name="idCard" constrained="true"/>
</class>
</hibernate-mapping>
*有两种策略可以实现一对一的关联映射
》主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应关系;数据库不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
》唯一外键关联:外键关联本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联映射
1.主键关联映射(单向)
实例场景:人-->***号(Person-->IdCard),从IdCard看不到Person对象对象模型:
IdCard实体类:
[html]
view plaincopy
public class IdCard {
private int id;
private String cardNo;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
}
Person实体类:
[html]
view plaincopy
public class Person {
private int id;
private String name;
private IdCard idCard;//持有IdCard对象的引用
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
}
}
IdCard实体映射文件:
[html]
view plaincopy
<hibernate-mapping>
<class name="com.cn.hibernate.IdCard" table="t_idcard">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
Person实体映射文件:
[html]
view plaincopy
<hibernate-mapping>
<class name="com.cn.hibernate.Person" table="t_person">
<id name="id" column="id">
<!--
因为主键不是自己生成的,而是作为一个外键(来源于其它值),所以使用foreign生成策略
foreign:使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用。
再使用元素<param>的属性值指定相关联对象(这里Person相关联的对象为idCard,则标识符为idCard的id)为了能够在加载person数据同时加载IdCard数据,所以需要使用一个标签<one-to-one>来设置这个功能。
-->
<generator class="foreign">
<!-- 元素<param>属性name的值是固定为property -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<!-- <one-to-one>标签
表示如何加载它的引用对象(这里引用对象就指idCard这里的name值是idCard),同时也说是一对一的关系。
默认方式是根据主键加载(把person中的主键取出再到IdCard中来取相关IdCard数据。)
我们也说过此主键也作为一个外键引用 了IdCard,所以需要加一个数据库限制(外键约束)constrained="true"
-->
<one-to-one name="idCard" constrained="true"/>
</class>
</hibernate-mapping>
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- 团队项目第二周 测试计划
- 每日一题5.31
- memcached基础介绍
- 开篇名义
- 正则表达式
- CSU1646: HearthStone(DP)
- 2015 百度之星 初赛2 1002 连接的管道(最小生成树)
- CSU1655: 文本计算器
- leetcode Add Two Numbers(链表)
- VMware中网络设置之NAT
- STM32定时器简介--极度基本版
- 日语语法总结-11 md version
- 初学Hibernate
- AndroidManifest.xml的权限总结
- nginx配置在一台虚拟主机下多站点服务(对应多域名
- Python Django 的 django templatedoesnotexist
- C语言调试的几种方法
- url与uri的区别
- 软考总结