Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射
Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射
Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射。
下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分别完成以下持久化操作:
(1)保存员工档案的同时分配给员工一个账号。
(2)加载员工档案的同时加载账号信息。
1.按照外键映射

步骤一:创建实体类Users1和Resume1
package cn.happy.onetoone.fk;
public class Resume1 {
private Integer resId;
private Integer resUserId;
private String resName;
private String resCardNo;
private Users1 users1;
public Integer getResId() {
return resId;
}
public void setResId(Integer resId) {
this.resId = resId;
}
public Integer getResUserId() {
return resUserId;
}
public void setResUserId(Integer resUserId) {
this.resUserId = resUserId;
}
public String getResName() {
return resName;
}
public void setResName(String resName) {
this.resName = resName;
}
public String getResCardNo() {
return resCardNo;
}
public void setResCardNo(String resCardNo) {
this.resCardNo = resCardNo;
}
public Users1 getUsers1() {
return users1;
}
public void setUsers1(Users1 users1) {
this.users1 = users1;
}
}
Resume1
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.happy.onetoone.fk"> <class name="Resume1" table="Resume1">
<id name="resId" column="RESID">
<generator class="sequence">
<param name="sequence">STU_SID</param>
</generator>
</id>
<property name="resName" type="string" column="RESRNAME"></property>
<property name="resCardNo" type="string" column="RESCARDNO"></property>
<many-to-one name="users1" class="Users1" column="RESUSERSID" cascade="all" unique="true"></many-to-one>
</class> </hibernate-mapping>
Resume1.hbm.xml
package cn.happy.onetoone.fk;
public class Users1 {
private Integer userId;
private String userName;
private String userpass;
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
private Resume1 resume1;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Resume1 getResume1() {
return resume1;
}
public void setResume1(Resume1 resume1) {
this.resume1 = resume1;
}
}
Users1.java
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.happy.onetoone.fk"> <class name="Users1" table="Users1">
<id name="userId" column="USERID">
<generator class="sequence">
<param name="sequence">STU_SID</param>
</generator>
</id>
<property name="userName" type="string" column="USERNAME"></property>
<property name="userpass" type="string" column="USERPASS"></property>
<one-to-one name="resume1" class="Resume1" property-ref="users1"></one-to-one>
</class> </hibernate-mapping>
Users1.hbm.xml
步骤二:配置文件Users1.hbm.xml和Resume1.hbm.xml


步骤三:测试方法书写
package cn.happy.onetoone.fk; import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import cn.happy.util.HibernateUtil; public class Testone {
/**
* 一对一 按外键映射
* **/
@Test
public void onetoont(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Resume1 re=new Resume1();
re.setResName("学院不");
re.setResCardNo("002"); Users1 use=new Users1();
use.setUserName("王喜"); use.setResume1(re);
re.setUsers1(use); session.save(re);
tx.commit();
HibernateUtil.closeSession(); } @Test
public void select(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Users1 u =(Users1) session.get(Users1.class, 2);
System.out.println(u.getResume1().getResName());
tx.commit();
HibernateUtil.closeSession();
} }
测试
二:按照主键映射

步骤一:创建实体类Users2和Resume2
package cn.happy.onetoone.pk;
public class Resume2 {
private Integer resId;
private Integer resUserId;
private String resName;
private String resCardNo;
private Users2 users1;
public Integer getResId() {
return resId;
}
public void setResId(Integer resId) {
this.resId = resId;
}
public Integer getResUserId() {
return resUserId;
}
public void setResUserId(Integer resUserId) {
this.resUserId = resUserId;
}
public String getResName() {
return resName;
}
public void setResName(String resName) {
this.resName = resName;
}
public String getResCardNo() {
return resCardNo;
}
public void setResCardNo(String resCardNo) {
this.resCardNo = resCardNo;
}
public Users2 getUsers1() {
return users1;
}
public void setUsers1(Users2 users1) {
this.users1 = users1;
}
}
Resume2.java
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.happy.onetoone.pk"> <class name="Resume2" table="Resume2">
<id name="resId" column="RESID">
<generator class="sequence">
<param name="sequence">STU_SID</param>
</generator>
</id>
<property name="resName" type="string" column="RESRNAME"></property>
<property name="resCardNo" type="string" column="RESCARDNO"></property>
<one-to-one name="users1" class="Users2" cascade="all" ></one-to-one>
</class> </hibernate-mapping>
Resume2.hbm.xml
package cn.happy.onetoone.pk;
public class Users2 {
private Integer userId;
private String userName;
private Resume2 resume1;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Resume2 getResume1() {
return resume1;
}
public void setResume1(Resume2 resume1) {
this.resume1 = resume1;
}
}
Users2.java
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.happy.onetoone.pk"> <class name="Users2" table="Users2">
<id name="userId" column="USERID">
<generator class="foreign">
<param name="property">resume1</param>
</generator>
</id>
<property name="userName" type="string" column="USERNAME"></property> <one-to-one name="resume1" class="Resume2" constrained="true"></one-to-one>
</class> </hibernate-mapping>
Users2.hbm.xml
步骤二:配置文件Users2.hbm.xml和Resume2.hbm.xml


步骤三:测试方法书写
package cn.happy.onetoone.pk; import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import cn.happy.util.HibernateUtil; public class Testone {
/**
* 一对一 按主键映射
* */
@Test
public void onetoont(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Resume2 re=new Resume2();
re.setResName("学院不2");
re.setResCardNo("2"); Users2 use=new Users2();
use.setUserName("王喜2"); use.setResume1(re);
re.setUsers1(use); session.save(re);
tx.commit();
HibernateUtil.closeSession(); } @Test
public void select(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Users2 u =(Users2) session.get(Users2.class, 1);
System.out.println(u.getResume1().getResName());
tx.commit();
HibernateUtil.closeSession();
} }
测试代码
3.组件映射
建立关系数据模型的一个重要原则是在不会导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系。以员工信息为例,员工信息中有员工的家庭地址信息,如果把地址信息单独放在一张表中,然后建立员工信息表和地址信息表之间的外键参照关系,当每次查询员工信息时,都需建立者两个表的连接。建立表的连接是很耗时的操作,为了提高数据库运行性能,可以把这两张表的信息整合在一张员工信息表EMPINFO中

步骤一:创建EmpHomeAddress和EmpInfo
package cn.happy.zujian;
public class EmpInfo {
private Integer eId;
private String eName;
private EmpHomeAddress eHome;
public Integer geteId() {
return eId;
}
public void seteId(Integer eId) {
this.eId = eId;
}
public String geteName() {
return eName;
}
public void seteName(String eName) {
this.eName = eName;
}
public EmpHomeAddress geteHome() {
return eHome;
}
public void seteHome(EmpHomeAddress eHome) {
this.eHome = eHome;
}
}
EmpInfo.java
package cn.happy.zujian;
public class EmpHomeAddress {
private String ehomestreet;
private String ehomecity;
private String ehomeprovince;
private String ehomezipcode;
private EmpInfo empinfo;
public EmpInfo getEmpinfo() {
return empinfo;
}
public void setEmpinfo(EmpInfo empinfo) {
this.empinfo = empinfo;
}
public String getEhomestreet() {
return ehomestreet;
}
public void setEhomestreet(String ehomestreet) {
this.ehomestreet = ehomestreet;
}
public String getEhomecity() {
return ehomecity;
}
public void setEhomecity(String ehomecity) {
this.ehomecity = ehomecity;
}
public String getEhomeprovince() {
return ehomeprovince;
}
public void setEhomeprovince(String ehomeprovince) {
this.ehomeprovince = ehomeprovince;
}
public String getEhomezipcode() {
return ehomezipcode;
}
public void setEhomezipcode(String ehomezipcode) {
this.ehomezipcode = ehomezipcode;
}
}
EmpHomeAddress
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.happy.zujian"> <class name="EmpInfo" table="EMPINFO">
<id name="eId" column="EID">
<generator class="sequence">
<param name="sequence">STU_SID</param>
</generator>
</id>
<property name="eName" type="string" column="ENAME"></property> <component name="eHome" class="EmpHomeAddress">
<parent name="empinfo"/>
<property name="ehomestreet" column="EHOMESTREET" type="string"></property>
<property name="ehomecity" column="EHOMECITY" type="string"></property>
<property name="ehomeprovince" column="EHOMEPROVINCE" type="string"></property>
<property name="ehomezipcode" column="EHOMEZIPCODE" type="string"></property>
</component> </class> </hibernate-mapping>
EmpInfo.hbm.xml
步骤二:创建配置文件EmpInfo.hbm.xml

步骤三:书写测试类
package cn.happy.zujian; import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import cn.happy.util.HibernateUtil; public class TestInfo {
/**
* 组件映射
* */
@Test
public void zujian(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction(); EmpInfo empinfo=new EmpInfo();
empinfo.seteName("回青"); EmpHomeAddress address=new EmpHomeAddress();
address.setEhomecity("北京");
address.setEhomeprovince("北京市");
address.setEhomestreet("成府路");
address.setEhomezipcode("10002");
empinfo.seteHome(address); session.save(empinfo);
tx.commit(); HibernateUtil.closeSession(); }
}
测试代码
Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射的更多相关文章
- Hibernate中的一对一关联和组件的映射
Hibernate提供了两种映射一对一映射关联关系的方式: 01.按照外键映射 02.按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这 ...
- Hibernate中的一对一关联
Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...
- hibernate 建表一对一 就是一对多,多的一方外键唯一unique
Person.java package cn.itcast.hiberate.sh.domain.onetoone; import java.io.Serializable; import java. ...
- Hibernate之映射一对一关联
一.一对一关联的概念: 一对一之间的关联是指:两张表中的信息是一对一的关系,比如我们每个人和身份证的关系,一个人对应一张身份证,一张身份证也只能对应一个人. Hibernate提供了两种映射一对一关联 ...
- Hibernate中的一对一映射关系
Hibernate中的一对一映射关系有两种实现方法(单向一对一,和双向一对一)(一对一关系:例如一个department只能有一个manager) 单向和双向有什么区别呢??例如若是单向一对一,比如在 ...
- Hibernate 性能优化一对一关联映射
概述: hibernate提供了两种映射一对一关联的方式:按照外键映射和按照主键映射. 下面以员工账号和员工档案为例 ,介绍两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1)保存员工档 ...
- Hibernate中的一对一映射
1.需求 用户和身份证是一一对应的关系. 有两种对应方式: 用户id作为身份证表的外键,身份证号作为主键: 用户id作为身份证表的主键: 2.实体Bean设计 User: public class U ...
- hibernate中多对多关联
hibernate中多对多关联 “计应134(实验班) 凌豪” 在关系数据库中有一种常见的关系即多对多关系,例如课程和学生的关系,一个学生可以选择多门课程,同时一门课程也可以被多个学生选择, 因此课程 ...
- MySQL基础9-主键约束、外键约束、等值连接查询、一对一和多对多关系
1.主键约束和外键约束 外键约束 * 外键必须是另一表的主键的值(外键要引用主键!) * 外键可以重复 * 外键可以为空 * 一张表中可以有多个外键! 概念模型在数据库中成为表 数据库表中的多对一关系 ...
随机推荐
- JAVA运行机制
这一篇我们来简单理解一下JAVA的运行机制 大概可以分为三大部分 1.编写程序 2.编译程序 3.运行程序 1.编写程序 编写程序就是我们前面说的源代码 这些源代码都有特殊的语法 例如main函数 他 ...
- python向多个邮箱发邮件--注意接收是垃圾邮件
群发邮件注意:三处标红的地方 # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from emai ...
- Servlet过滤器---登录权限控制
实现了登录时权限控制:进入首页.登录页以及登录servlet时,不用验证权限:进入其它页面时,须验证是否登录,未登录则跳转到登录页. 一个简单的首页:index.jsp <%@ page lan ...
- django之python3.4及以上连接mysql的一些问题记录
首先,祭出大杀器whl https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient django1.x与django2.x 在项目的写法上有一些区别 ...
- easyui 获取树的平级根节点的父节点&选择性展示树的一个根节点
1.easyui的树的根节点一般是几个平级的,怎样获取这些父节点的id? 可以将获取到的平级根节点放在一个数组中 var roots=[]; roots=$("#tree1").t ...
- Spring_依赖注入思想
Ioc(Inversion of Control) 控制反转,DI(Dependncy Injection)依赖注入,其实是指同一种思想.举例说明: 张三在某公司负责供水问题.有两种形式,第一种老板指 ...
- 《Cracking the Coding Interview》——第13章:C和C++——题目6
2014-04-25 20:07 题目:为什么基类的析构函数必须声明为虚函数? 解法:不是必须,而是应该,这是种规范.对于基类中执行的一些动态资源分配,如果基类的析构函数不是虚函数,那么 派生类的析构 ...
- 随笔 —— 门徒 & 无限恐怖
门徒 忧思缠身,所为何物 不知何人,可免世俗 每每朝暮,心无释处 悲从中来,如泣如诉 仁者存世,满怀悲苦 逝者如斯,追还无路 上天无门,开怀捧腹 无路偏行,我行我素 无限恐怖 饥寒苦难谁知故,日日行路 ...
- php导出数据为CSV文件DEMO
代码示例: private function _download_send_headers($filename) { // disable caching $now = gmdate("D, ...
- Unity-SendMessage
每一个对象都有SendMessage,BroadcastMessage,SendMessageUpwards 三个发送消息的方法! 1.功能: 执行某个对象中的某个方法! 2.实现原理 反射 ...