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中映射一对一关联(按主键映射和外键映射)和组件映射的更多相关文章

  1. Hibernate中的一对一关联和组件的映射

    Hibernate提供了两种映射一对一映射关联关系的方式: 01.按照外键映射 02.按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这 ...

  2. Hibernate中的一对一关联

    Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...

  3. hibernate 建表一对一 就是一对多,多的一方外键唯一unique

    Person.java package cn.itcast.hiberate.sh.domain.onetoone; import java.io.Serializable; import java. ...

  4. Hibernate之映射一对一关联

    一.一对一关联的概念: 一对一之间的关联是指:两张表中的信息是一对一的关系,比如我们每个人和身份证的关系,一个人对应一张身份证,一张身份证也只能对应一个人. Hibernate提供了两种映射一对一关联 ...

  5. Hibernate中的一对一映射关系

    Hibernate中的一对一映射关系有两种实现方法(单向一对一,和双向一对一)(一对一关系:例如一个department只能有一个manager) 单向和双向有什么区别呢??例如若是单向一对一,比如在 ...

  6. Hibernate 性能优化一对一关联映射

    概述: hibernate提供了两种映射一对一关联的方式:按照外键映射和按照主键映射. 下面以员工账号和员工档案为例 ,介绍两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1)保存员工档 ...

  7. Hibernate中的一对一映射

    1.需求 用户和身份证是一一对应的关系. 有两种对应方式: 用户id作为身份证表的外键,身份证号作为主键: 用户id作为身份证表的主键: 2.实体Bean设计 User: public class U ...

  8. hibernate中多对多关联

    hibernate中多对多关联 “计应134(实验班) 凌豪” 在关系数据库中有一种常见的关系即多对多关系,例如课程和学生的关系,一个学生可以选择多门课程,同时一门课程也可以被多个学生选择, 因此课程 ...

  9. MySQL基础9-主键约束、外键约束、等值连接查询、一对一和多对多关系

    1.主键约束和外键约束 外键约束 * 外键必须是另一表的主键的值(外键要引用主键!) * 外键可以重复 * 外键可以为空 * 一张表中可以有多个外键! 概念模型在数据库中成为表 数据库表中的多对一关系 ...

随机推荐

  1. OSI七层模型 学习摘要

    OSI参考模型是计算机网路体系结构发展的产物.它的基本内容是开放系统通信功能的分层结构.这个模型把开放系统的通信功能划分为七个层次,从邻接物理媒体的层次开始,分别赋于1,2,……7层的顺序编号,相应地 ...

  2. python-13常用内建模块

    1-datetime #1-获取当前日期和时间 from datetime import datetime now = datetime.now() #当前时间 print(now) #2015-05 ...

  3. sql查询题目

    --1.查询在1981年入职的员工信息select * from emp where hiredate between '01-1月-1981'and '31-12月-1981'; select * ...

  4. PHP.21-商品信息管理

    商品信息管理 在线增删改查和图片信息管理 主要技术:文件上传.图片缩放.数据库基本操作 思路: 1.设计并创建数据库 库名:demodb 表名:goods 编号(id) 名称(name) 商品类型(t ...

  5. 图的深度优先遍历&广度优先遍历

    1.什么是图的搜索? 指从一个指定顶点可以到达哪些顶点   2.无向完全图和有向完全图 将具有n(n-1)/2条边的无向图称为无向完全图(完全图就是任意两个顶点都存在边). 将具有n(n-1)条边的有 ...

  6. laravel5.5探究容器的秘密

    目录 1. 定义一个契约(接口) 2. 一个实现这个接口的类 3. 创建服务提供者 4. 注册服务提供者 5. 创建facades 6. 再然后需要到配置文件config/app.php中注册门面类别 ...

  7. Django基本使用

    目录 1 安装 1.1 安装pip 1.2 安装django 2 创建项目 2.1 使用 管理工具 django-admin.py 来创建 PyLearn 项目: 2.2 启动服务 本文章以下所有列子 ...

  8. 设置虚拟wifi,手机和电脑可以连接

    在家里没有wifi,笔记本电脑又是宽带连接,有时候手机流量用得很快,于是网上找了一下设置虚拟wifi 方法. 1.首先你的电脑上要有无线网卡,并且无线网上一定要是开户的,一般默认的都开启,如果没有开启 ...

  9. 实现jQuery的$.extend方法

    var o1 = { hello : 1, old : 555 }, o2 = { abc : 55555555, hello : 2, fun : function() { alert(111); ...

  10. 剑指Offer - 九度1516 - 调整数组顺序使奇数位于偶数前面

    剑指Offer - 九度1516 - 调整数组顺序使奇数位于偶数前面2013-11-30 02:17 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部 ...