`

第六章 一对一关系

阅读更多
什么时候采用一对一关系映射呢?
比如我们有时在网上注册的时候,用户名,密码,邮箱必填,然后提供了一个复选框,可以选填用户的详细资料.那么如果在数据库中, 我们通常会建两张表,如下:

但是在Hibernate中会怎么实现这个呢,大家过细观察一下,会不会觉得这个外键有点多余,如果我们让从表的ID和主表的ID一样,即让从表的ID即是主键又是外键,会不会更好呢,Hibernate中就是这样实现一对一的关系的.

那么下面请看具体代码:
我们将利用自动创建SQL的特点来建表,我们就不需要建表了,只需要建立类,关联类之间的关系就可以了.

UserBase:
public class UserBase {
private String id;
private String userAccount;
private String userPwd;
private String userEmail;
private UserData userData;

public UserBase() {
super();
}

public UserBase(String userAccount, String userPwd, String userEmail) {
super();
this.userAccount = userAccount;
this.userPwd = userPwd;
this.userEmail = userEmail;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getUserAccount() {
return userAccount;
}

public void setUserAccount(String userAccount) {
this.userAccount = userAccount;
}

public String getUserPwd() {
return userPwd;
}

public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}

public String getUserEmail() {
return userEmail;
}

public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}

public UserData getUserData() {
return userData;
}

public void setUserData(UserData userData) {
this.userData = userData;
}
}

UserData:
import java.util.Date;

public class UserData {
private String id;
private String userName;
private Date birthday;
private String mobile;
private UserBase userBase;

public UserData() {
super();
}

public UserData(String userName, Date birthday, String mobile) {
super();
this.userName = userName;
this.birthday = birthday;
this.mobile = mobile;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public Date getBirthday() {
return birthday;
}

public void setBirthday(Date birthday) {
this.birthday = birthday;
}

public String getMobile() {
return mobile;
}

public void setMobile(String mobile) {
this.mobile = mobile;
}

public UserBase getUserBase() {
return userBase;
}

public void setUserBase(UserBase userBase) {
this.userBase = userBase;
}
}

UserBase.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="chapter3.model.UserBase" table="user_base">
<id name="id" type="java.lang.String" column="id" length="32">
<generator class="uuid.hex" />
</id>
<property name="userAccount" type="java.lang.String" column="userAccount"
length="20" />
<property name="userPwd" type="java.lang.String" column="userPwd"
length="20" />
<property name="userEmail" type="java.lang.String" column="userEmail"
length="50" />
<one-to-one name="userData" class="chapter3.model.UserData" />
</class>
</hibernate-mapping>

UserData.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="chapter3.model.UserData" table="user_data">
<id name="id" type="java.lang.String" column="id" length="32">
<generator class="foreign">
<param name="property">userBase</param>
</generator>
</id>
<property name="userName" type="java.lang.String" column="userName"
length="50" />
<property name="birthday" type="java.util.Date" column="birthday"
length="10" />
<property name="mobile" type="java.lang.String" column="mobile"
length="11" />
<one-to-one name="userBase" class="chapter3.model.UserBase" />
</class>
</hibernate-mapping>

UserBaseDao:
public class UserBaseDao {
public void create(UserBase userBase) throws Exception {
Session session = null;
try {
session = HibernateUtil.getSession();
session.beginTransaction();
session.save(userBase);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
throw e;
}
}

public UserBase findById(Serializable id) throws Exception {
Session session = null;
UserBase userBase = null;
try {
session = HibernateUtil.getSession();
session.beginTransaction();
userBase = (UserBase) session.get(UserBase.class, id);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
throw e;
}
return userBase;
}
}

UserDataDao:
public class UserDataDao {
public void create(UserData userData) throws Exception {
Session session = null;
try {
session = HibernateUtil.getSession();
session.beginTransaction();
session.save(userData);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
throw e;
}
}

public UserData findById(Serializable id) throws Exception {
Session session = null;
UserData userData = null;
try {
session = HibernateUtil.getSession();
session.beginTransaction();
userData = (UserData) session.get(UserData.class, id);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
throw e;
}
return userData;
}
}

Test:
public class Test {
public static void main(String[] args) throws Exception {
UserBaseDao userBaseDao = new UserBaseDao();
UserDataDao userDataDao = new UserDataDao();

UserBase userBase = new UserBase("zhanghaidang", "791126",
"wdpc@163.com");
userBaseDao.create(userBase);

UserData userData = new UserData("张海当", new Date(), "13986007262");
userData.setUserBase(userBase);
userDataDao.create(userData);
}
}

总结:
主键关联一对一映射不需要额外的字段,对象之间必须共享相同的主键;
一对一映射默认采用级联操作,存储一个对象的时候,另一个对象也同时被储存;
配置子表的主键时,注意主键的生成策略:
<id name="id" type="java.lang.String" column="id" length="32">
<generator class="foreign">
<param name="property">userBase</param>
</generator>
</id>
采用的是foreign外键策略,意指该表的主键来自另一张表, 并且需要告诉策略对应的类,可以查看源码包下的ForeignGenerator类的源代码,重点看下面的代码,该类会获取一个参数 params.getProperty("property"); 那么这时我们需要将property参数的值传给它, 传参的代码为上面的形式.
public void configure(Type type, Properties params, Dialect d)
throws MappingException {
propertyName = params.getProperty("property");
entityName = params.getProperty(ENTITY_NAME);
if (propertyName==null) throw new MappingException(
"param named \"property\" is required for foreign id generation strategy"
);
}

运用的时候需要注意,一定要先创建主表的对应类,因为只有创建了主表的对应类,子表才能够取得ID主键,从而为自己设置主键的值.
  • 大小: 4.7 KB
  • 大小: 4.4 KB
分享到:
评论

相关推荐

    数据库系统原理第一章习题.docx

    2、两个实体型之间的联系可以分为三种:一对一联系、______________和_____________。 3、数据库的三级模式结构中,描述局部数据的逻辑结构和特征的是______________。 4、数据模型的组成要素中描述系统的静态特性...

    过控制工程第一章PPT

    第6章 选择性控制系统 6.1 慨述 6.2 选择性控制系统的类型及应用 6.2.1 开关型选择性控制系统 6.2.2 连续型选择性控制系统 6.2.3 混合型选择性控制系统 6.3 选择性控制系统的设计 6.4 积分饱和...

    数据库系统概论 王珊 萨师煊 第三版--中国人民大学优秀课件

    第三章 关系数据库标准语言SQL,第四章 关系系统及其查询优化,第五章 关系数据理论,第六章 数据库设计,第七章 数据库恢复技术,第八章 并发控制。 当然,并不是完全按照课本的,这里讲的都是没有废话的,对数据库...

    印章管理办法模板.doc

    第六条 印章持有情况纳入员工离职时移交工作的一部分,如员工持有公司印章地,须办理归还印章手续后方可办理离职手续。 第三章 印章地使用 第七条 公司各级人员需使用印章须按要求填写印章使用单,将其与所需印的...

    数据库---第6章-数据库设计客观题及答案.doc

    第6章 数据库设计练习题 1.如何构造出一个合适的数据逻辑结构是( )主要解决的问题 A. 物理结构设计B.数据字典C.逻辑结构设计D.关系数据库查询 2.概念结构设计是整个数据库设计的关键,它通过对用户需求进行综合、...

    数据库系统概论第5版课后答案第4章-数据库安全性(1).doc

    第4章 数据库安全性 1. 什么是数据库的安全性? 答:数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破 坏。 2. 数据库安全性和计算机系统的安全性有什么关系? 答:安全性问题不是数据库...

    ACCESS2010数据库基础教程-01第一章数据库系统概述.pptx

    ACCESS2010数据库基础教程-01第一章数据库系统概述全文共24页,当前为第6页。 数据库主要研究如何对数据进行科学的管理,以提供可靠的、可共享的、安全的、有意义的数据。 数据库技术一般包含数据管理和数据处理两...

    数据库系统原理第一章习题.doc

    2、两个实体型之间的联系可以分为三种:一对一联系、______________和____________ _。 3、数据库的三级模式结构中,描述局部数据的逻辑结构和特征的是______________. 4、数据模型的组成要素中描述系统的静态特性和...

    数据库管理系统第一章.doc

    " "A)一对一 " "B)一对多 " " " "C)多对一 " "D)多对多 " " " "[D] 教师批改:D " "10、在Visual FoxPro中以下叙述错误的是( )。 " "A)关系也被称作表 " "B)数据库文件不存储用户数据 " " " "C)表文件的扩展名是....

    UNIX环境高级编程

    (第六章)进程—Unix进程的环境 (第七章)进程控制 (第八章)进程之间的关系 (第九章)以及信号 (第十章)终端I/O (第十一章)、高级I/O (第十二章)以及精灵进程 (第十三章)IPC——进程间通信 (第十四、...

    《计算机应用基础》第四章课后答案.doc.doc

    正确答案是:多于1个 题目6 关于操作系统性能和系统资源关系描述正确的是() CPU越快越好 硬盘越大越好 内存越大越好 合理配置的硬件正确 正确答案是:合理配置的硬件 题目7 正在执行磁盘竺操作时,遇到磁盘满的...

    网络安全发教程-第二章----网络空间安全战略.pptx

    网络安全发教程-第二章----网络空间安全战略全文共17页,当前为第6页。 二、网络空间安全战略的规范性文件 (一)网络空间安全战略的法条依据 《网络安全法》第四条国家制定并不断完善网络安全战略,明确保障网络...

    C语言标准教程第一章 C语言概论

    第一章: C语言概论 C语言的发展过程  C语言是在70年代初问世的。一九七八年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”...

    跟我学spring3(1-7)

    【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我学spring3 【第六章】 AOP 之 6.3 基于Schema的AOP ——跟我学spring3 【第六章】 AOP 之 6.4 基于@AspectJ的AOP ——跟我学spring3 【第六章】 AOP 之 6.5 AspectJ...

    数据库系统原理第一章习题(2).doc

    2、两个实体型之间的联系可以分为三种:一对一联系、______________和___________ __。 3、数据库的三级模式结构中,描述局部数据的逻辑结构和特征的是______________。 4、数据模型的组成要素中描述系统的静态特性...

    数据库系统原理第一章习题(1).doc

    2、两个实体型之间的联系可以分为三种:一对一联系、______________和___________ __。 3、数据库的三级模式结构中,描述局部数据的逻辑结构和特征的是______________。 4、数据模型的组成要素中描述系统的静态特性...

    数据库系统原理第一章习题(3).doc

    2、两个实体型之间的联系可以分为三种:一对一联系、______________和___________ __。 3、数据库的三级模式结构中,描述局部数据的逻辑结构和特征的是______________。 4、数据模型的组成要素中描述系统的静态特性...

    Hibernate3开发.pdf

    系统学习Hibernate3的开发...第六章:性能提升和二级缓存 包括:抓取策略、集合的性能、二级缓存、查询缓存、管理缓存 第七章:基本实现原理 包括:分增删改查的操作说明Hibernate基本的实现原理 第八章:最佳实践

    产品经理手册

    第六章 分公司产品经理工作内容及指导 43 1、目的 43 2、工作内容模型 43 3、职责 44 3.1 客户关系工作 44 3.2 市场工作 44 3.3 销售工作 45 3.4 服务工作 48 附件: 从市场需求到产品开发 49 1、业界产品开发的总体...

    数据库系统导论(第七版)

    第6章 关系代数 106 6.1 引言 106 6.2 关系封闭性 107 6.3 语法 109 6.4 语义 110 6.5 举例 117 6.6 关系代数的作用 119 6.7 附加的操作符 120 6.8 分组与分组还原 125 6.9 关系比较 127 6.10 小结 128 练习 129 ...

Global site tag (gtag.js) - Google Analytics