【Hibernate】一对一主键关联映射
来源:互联网 发布:淘宝folk老王是正品吗 编辑:程序博客网 时间:2024/05/22 06:26
【回顾】
上篇博客内容是对Hibernate实体间多对一关联关系的学习和总结,本篇博客继续关联映射的学习,实体间关系为一对一。
【一对一】
1. 原理:让两个实体的主键一样,这样就不需要加入多余的字段了。
2. 示例:在用户Person从表中,存在一个id字段作为主键,而在另一个身份证信息IDCard主表中,同样存在一个id字段是主键,且这两个字段相同。所以用户Person从表与身份证信息IDCard主表之间是存在一对一关系的。
3. 实体类代码:
Person实体:package com.bjpowernode.hibernate;public class Person { private int id; private String name; //将IDCard实体引用到Person实体中 private 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实体类:package com.bjpowernode.hibernate;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; }}4. 关联配置映射文件:
IDCard.hbm.xml:<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard"> <id name="id"> <!-- 该实体主键生成策略为native,根据数据库系统自动设置 --> <generator class="native"/> </id> <property name="cardNo"/> </class></hibernate-mapping> Person.hbm.xml:<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping> <class name="com.bjpowernode.hibernate.Person" table="t_person"> <id name="id"> <!-- 采用foreign生成策略,foreign会取得关联对象的标识 --> <generator class="foreign"> <!-- 添加参数,property指关联对象 --> <param name="property">idCard</param> </generator> </id> <property name="name"/> <!-- one-to-one指示Hibernate如何加载其关联对象,默认根据主键加载 也就是拿到关系字段值,根据对端的主键来加载关联对象 constrained="true表示,当前主键(person的主键)还是一个外键 参照了对端的主键(IdCard的主键),也就是会生成外键约束语句 --> <one-to-one name="idCard" constrained="true"/> </class></hibernate-mapping>
5. 小结:
对于一对一关联关系:
在定义实体类的时候,在从表实体中引用主表实体。
在配置关系映射的时候,需要在从表实体的配置文件中,将主键生成策略设置为foreign,添加参数设置,值为引用的对象,且默认了cascade属性;添加<one-to-one>标签,配置其name属性,也是引用的对象,可以用constrained属性进行外键约束设置。
上述方法仅是实体间的单向关联,也就是我们只是把IDCard引入到了person中,而IDCard中并没有引用person,所以我们在根据Id值查询的时候,只能通过person查询相关属性,而不能通过IDCard查询相关属性。
由此,就有了下面的双向关联。
1. 实体类代码:
Person实体类代码不变,在IDCard实体类中加入对Person的引用:
package com.bjpowernode.hibernate;public class IdCard { private int id; private String cardNo; //增加对person的引用 private Person person; 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; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; }}2. 关联配置映射文件:
IDCard配置文件:<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <!-- 在此配置中同样加上one-to-one标签 --> <one-to-one name="person"/> </class></hibernate-mapping>
3. 小结:
对于一对一的双向关联关系:
在实体类中,互相添加引用关系。
在映射配置文件中,互相增加<one-to-one>标签的设置。
这样便可以通过idcard实体类去查询两个表的相关属性,但同样不能通过IDCard去存储新的记录。
【结语】
上述的单向关联与双向关联都是属于根据主键进行关联映射,即:让两个对象具有相同的主键值,以表明它们之间的一对一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键进行关联。但这样的方法不易扩展,所以,一般采用的方法是唯一外键关联,将在下篇博客中继续学习。
0 0
- Hibernate一对一主键关联映射
- hibernate一对一主键关联映射
- hibernate一对一主键关联映射
- 【Hibernate】一对一主键关联映射
- hibernate映射一对一关联(主键关联)
- Hibernate关联映射1:一对一主键关联
- Hibernate映射详解--一对一主键关联映射
- hibernate一对一主键关联映射双向
- Hibernate映射(一)------单向一对一主键关联
- Hibernate一对一主键关联映射(单向)
- Hibernate一对一主键关联映射(双向)
- hibernate映射总结详解: 按主键映射一对一关联关系
- Hibernate映射详解(三)--一对一主键关联映射
- Hibernate一对一主键关联
- hibernate一对一主键关联
- Hibernate学习12 -- 关联映射2 -- 一对一关联1 -- 一对一主键关联
- Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
- Hibernate关系映射(3)_一对一单向主键关联
- 和母亲的谈话记录及反思
- jstl用法
- CentOS 7 安装nginx
- Spring学习第一天: Hello World
- pom.xml详解
- 【Hibernate】一对一主键关联映射
- python进制转换
- 关于JSP的总结(2)
- NYOJ1100-BFS+优先队列
- 导入第三方类库,运行报错1609
- 今天居然收到了一封邀请我来审稿的邮件
- UVA 10815
- 第二周项目3—体验复杂度
- Agile基础:Scrum的5个会议