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.主键约束和外键约束 外键约束 * 外键必须是另一表的主键的值(外键要引用主键!) * 外键可以重复 * 外键可以为空 * 一张表中可以有多个外键! 概念模型在数据库中成为表 数据库表中的多对一关系 ...
随机推荐
- python flask学习第2天 URL中两种方式传参
新创建项目 自己写个url映射到自定义的视图函数 在url中传递参数 app.py from flask import Flask app = Flask(__name__) @app.route ...
- B1008 数组元素循环右移问题 (20分)
B1008 数组元素循环右移问题 (20分) 思路 1 2 3 4 5 6 5 6 1 2 3 4 6个数,循环右移2位. 也可以理解为 先翻转 6 5 4 3 2 1 然后再两部分,分别翻转 5 6 ...
- 如何使用Python脚本
来自官方文档 一.写 python 脚本: import sys import datetime for line in sys.stdin: line = line.strip() userid, ...
- Java线程和多线程(七)——ThreadLocal
Java中的ThreadLocal是用来创建线程本地变量用的.我们都知道,访问某个对象的所有线程都是能够共享对象的状态的,所以这个对象状态就不是线程安全的.开发者可以通过使用同步来保证线程安全,但是如 ...
- 微信小程序 | 49,小程序入门集锦系列文章20篇
以下20篇文章,都是关于微信小程序的文章,以入门常见问题为主.如发现谬误,请与笔者联系. [小程序入门集锦]1,微信小程序在哪里打开 [小程序入门集锦]2,小程序商店 [小程序入门集锦]3,微信小程序 ...
- 解决不了bug的时候看一下:
解决不了bug的时候看一下: 1.机器是不会出错的,出错的一定是人.只是你还没有意识到哪里出了错. 2.产生bug 的原因想错了,你以为是系统的bug ,那么你肯定就不想着去解决,你也就解决不了. 这 ...
- vim 简单命令
(1)查找结果全部单独显示 命令: :lvimgrep /pattern/ % | lopen (2)设置文本高亮 命令: :colorscheme evening 把 ":colorsch ...
- 什么是App加壳,以及App加壳的利与弊
非著名程序员涩郎 非著名程序员,字耿左直右,号涩郎,爱搞机,爱编程,是爬行在移动互联网中的一名码匠!个人微信号:loonggg,微博:涩郎,专注于移动互联网的开发和研究,本号致力于分享IT技术和程序猿 ...
- rabbitmq之rpc
环境:windows或者Linux,python3.6,rabbitmq3.5要求: 可以对指定机器异步的执行多个命令 例子: >>:run "df -h" --hos ...
- 孤荷凌寒自学python第二十五天初识python的time模块
孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...