- 浏览: 63905 次
- 性别:
- 来自: 武汉
最新评论
-
武大鹏程加内特:
武大鹏程加内特 写道任雅菲 写道
3Q 呵呵
你QQ多少? ...
第十一章 MyEclipse自动生成映射文件(上) -
武大鹏程加内特:
zzy90718 写道
第九章 Spring配置数据连接池 -
武大鹏程加内特:
任雅菲 写道
3Q 呵呵
第十一章 MyEclipse自动生成映射文件(上) -
武大鹏程加内特:
任雅菲 写道
第十一章 MyEclipse自动生成映射文件(上) -
任雅菲:
第十一章 MyEclipse自动生成映射文件(上)
什么时候采用一对一关系映射呢?
比如我们有时在网上注册的时候,用户名,密码,邮箱必填,然后提供了一个复选框,可以选填用户的详细资料.那么如果在数据库中, 我们通常会建两张表,如下:
但是在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主键,从而为自己设置主键的值.
比如我们有时在网上注册的时候,用户名,密码,邮箱必填,然后提供了一个复选框,可以选填用户的详细资料.那么如果在数据库中, 我们通常会建两张表,如下:
但是在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主键,从而为自己设置主键的值.
发表评论
-
第十七章 离线,命名查询
2010-05-03 20:29 825 离线查询 在Hibernate中,查询有两种方式,一种是 ... -
第十六章 批量插入,多类分页查询
2010-05-03 20:26 955批量插入 有时候我们需要做导入的功能,那么这个时候就需要批量插 ... -
第十五章 事务边界问题
2010-05-03 20:24 2590 事务边界问题 我们先回顾一下我们现在写的代码: 可 ... -
第十四章 缓存的使用
2010-05-03 20:18 826缓存的使用 我们先来模拟一个缓存的机制 以查询学生为示例: p ... -
第十三章 lazy懒加载
2010-05-03 20:12 945lazy属性:懒加载 作用:当调用方法的时候才去执行要执行的S ... -
第十二章 继承关系的映射
2010-05-03 20:07 855继承模型 在企业中经常会有员工的分类 我们在Java对象模型 ... -
第十一章 MyEclipse自动生成映射文件(下)
2010-04-28 19:57 1251选中必要的选项 选择主键生成的策略: 设置类名与数据库 ... -
第十一章 MyEclipse自动生成映射文件(上)
2010-04-28 19:44 3191 设置数据库连接 转换视图 创建新的数据库连接 设置 ... -
第十章 Inverse的作用
2010-04-28 19:04 740Inverse的作用 我们还是拿上一章的班级与学生的示例来说 ... -
第九章 级联,集合映射
2010-04-28 19:03 763级联开关 1.级联是指两个对象之间的操作联动关系,对一个对象执 ... -
第八章 Hibernate分页
2010-04-28 18:55 655Hibernate分页 -
第七章 多对多
2010-04-28 18:50 637 多对多 什么情况下会出现多对多呢?比如学生选课就会出现多 ... -
第五章 一对多关系
2010-04-28 18:44 797 一对多的关系 在学生与班级对象模型中,通常多个学生实体对应 ... -
第四章 多对一关系
2010-04-28 18:43 838今天我们讲多表操作, 多对一的关系 何为多对一呢? 示例: 学 ... -
第三章 对象的状态
2010-04-28 18:42 852 current_session_context_class ... -
第二章 Hibernate增删改查参考
2010-04-28 18:39 1659Hibernate中对增删改查的小结 mysql中库表N ... -
第二章 策略及对象增删改查操作
2010-04-28 18:37 1067Generator 主键生成器 incre ... -
第二章 对象关系数据库映射基础
2010-04-28 18:35 898Generator 主键生成器 incre ... -
第一章 Hibernate环境搭建
2010-04-28 18:34 1415如果是WEB工程,我们只需 ...
相关推荐
2、两个实体型之间的联系可以分为三种:一对一联系、______________和_____________。 3、数据库的三级模式结构中,描述局部数据的逻辑结构和特征的是______________。 4、数据模型的组成要素中描述系统的静态特性...
第6章 选择性控制系统 6.1 慨述 6.2 选择性控制系统的类型及应用 6.2.1 开关型选择性控制系统 6.2.2 连续型选择性控制系统 6.2.3 混合型选择性控制系统 6.3 选择性控制系统的设计 6.4 积分饱和...
第三章 关系数据库标准语言SQL,第四章 关系系统及其查询优化,第五章 关系数据理论,第六章 数据库设计,第七章 数据库恢复技术,第八章 并发控制。 当然,并不是完全按照课本的,这里讲的都是没有废话的,对数据库...
第六条 印章持有情况纳入员工离职时移交工作的一部分,如员工持有公司印章地,须办理归还印章手续后方可办理离职手续。 第三章 印章地使用 第七条 公司各级人员需使用印章须按要求填写印章使用单,将其与所需印的...
第6章 数据库设计练习题 1.如何构造出一个合适的数据逻辑结构是( )主要解决的问题 A. 物理结构设计B.数据字典C.逻辑结构设计D.关系数据库查询 2.概念结构设计是整个数据库设计的关键,它通过对用户需求进行综合、...
第4章 数据库安全性 1. 什么是数据库的安全性? 答:数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破 坏。 2. 数据库安全性和计算机系统的安全性有什么关系? 答:安全性问题不是数据库...
ACCESS2010数据库基础教程-01第一章数据库系统概述全文共24页,当前为第6页。 数据库主要研究如何对数据进行科学的管理,以提供可靠的、可共享的、安全的、有意义的数据。 数据库技术一般包含数据管理和数据处理两...
2、两个实体型之间的联系可以分为三种:一对一联系、______________和____________ _。 3、数据库的三级模式结构中,描述局部数据的逻辑结构和特征的是______________. 4、数据模型的组成要素中描述系统的静态特性和...
" "A)一对一 " "B)一对多 " " " "C)多对一 " "D)多对多 " " " "[D] 教师批改:D " "10、在Visual FoxPro中以下叙述错误的是( )。 " "A)关系也被称作表 " "B)数据库文件不存储用户数据 " " " "C)表文件的扩展名是....
(第六章)进程—Unix进程的环境 (第七章)进程控制 (第八章)进程之间的关系 (第九章)以及信号 (第十章)终端I/O (第十一章)、高级I/O (第十二章)以及精灵进程 (第十三章)IPC——进程间通信 (第十四、...
正确答案是:多于1个 题目6 关于操作系统性能和系统资源关系描述正确的是() CPU越快越好 硬盘越大越好 内存越大越好 合理配置的硬件正确 正确答案是:合理配置的硬件 题目7 正在执行磁盘竺操作时,遇到磁盘满的...
网络安全发教程-第二章----网络空间安全战略全文共17页,当前为第6页。 二、网络空间安全战略的规范性文件 (一)网络空间安全战略的法条依据 《网络安全法》第四条国家制定并不断完善网络安全战略,明确保障网络...
第一章: C语言概论 C语言的发展过程 C语言是在70年代初问世的。一九七八年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”...
【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我学spring3 【第六章】 AOP 之 6.3 基于Schema的AOP ——跟我学spring3 【第六章】 AOP 之 6.4 基于@AspectJ的AOP ——跟我学spring3 【第六章】 AOP 之 6.5 AspectJ...
2、两个实体型之间的联系可以分为三种:一对一联系、______________和___________ __。 3、数据库的三级模式结构中,描述局部数据的逻辑结构和特征的是______________。 4、数据模型的组成要素中描述系统的静态特性...
2、两个实体型之间的联系可以分为三种:一对一联系、______________和___________ __。 3、数据库的三级模式结构中,描述局部数据的逻辑结构和特征的是______________。 4、数据模型的组成要素中描述系统的静态特性...
2、两个实体型之间的联系可以分为三种:一对一联系、______________和___________ __。 3、数据库的三级模式结构中,描述局部数据的逻辑结构和特征的是______________。 4、数据模型的组成要素中描述系统的静态特性...
系统学习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 ...