9.hibernate的一对一映射
一、hibernate的一对一按照外键映射
1.创建如下sql脚本:
--员工账号表
create table USERS1
(
USERID NUMBER(6) not null,
USERNAME VARCHAR2(20),
USERPASS VARCHAR2(20)
)
; --档案表
create table RESUME1
(
RESID NUMBER(6) not null,
RESUSERID NUMBER(6),
RESNAME VARCHAR2(20),
RESCARDNO VARCHAR2(20)
)
; alter table USERS1
add constraint PK_USERS1_USERID primary key (USERID); alter table RESUME1
add constraint PK_RESUME1_RESID primary key (RESID);
alter table RESUME1
add constraint FK_RESUME1_RESUSERID foreign key (RESUSERID)
references USERS1 (USERID);
fk_one_to_one_.sql
2.创建如下web项目结构
3.在项目的src根目录下创建主配置文件hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property>
<property name="connection.username">holly</property>
<property name="connection.password">sys</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property> <mapping resource="com/entity/Resume1.hbm.xml"/>
<mapping resource="com/entity/Users1.hbm.xml"/>
</session-factory>
</hibernate-configuration>
hibernate.cfg.xml
4.在项目的src的com.entity包下创建Users1.java类
package com.entity; import java.util.HashSet;
import java.util.Set;
/**
* 员工账号表
* @author Dell
*
*/
public class Users1 {
private Integer userid; //员工账号id
private String username; //员工姓名
private String userpass; //员工账号密码
private Resume1 resume1; //档案对象 public Users1() {
}
public Users1(Integer userid, String username, String userpass) {
this.userid = userid;
this.username = username;
this.userpass = userpass;
}
public Users1(Integer userid, String username, String userpass,
Resume1 resume1) {
this.userid = userid;
this.username = username;
this.userpass = userpass;
this.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 String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
} public Resume1 getResume1() {
return resume1;
}
public void setResume1(Resume1 resume1) {
this.resume1 = resume1;
}
@Override
public String toString() {
return "Users1 [resume1=" + resume1 + ", userid=" + userid
+ ", username=" + username + ", userpass=" + userpass + "]";
} }
Users1.java
5.在项目的src的com.entity包下创建Users1.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="com.entity.Users1" table="USERS1" schema="HOLLY" >
<id name="userid" type="java.lang.Integer" column="USERID">
<generator class="assigned"/>
</id>
<property name="username" type="java.lang.String" column="USERNAME"/>
<property name="userpass" type="java.lang.String" column="USERPASS"/> <!-- 多对一映射:name是emp中外键字段引用的对象,class是对象的类型,column是数据库中对应的外键列字段名 -->
<one-to-one name="resume1" class="com.entity.Resume1" property-ref="users1"/>
</class>
</hibernate-mapping>
Users1.hbm.xml
6.在项目的src的com.entity包下创建Resume1.java类
package com.entity; import java.util.Date;
/**
* 档案表
* @author Dell
*
*/
public class Resume1 {
private Integer resid; //档案编号
private Users1 users1; //用户对象
private String resname; //档案名称
private String rescardno; //档案卡号 public Resume1() {
} public Resume1(Integer resid, String resname, String rescardno) {
this.resid = resid;
this.resname = resname;
this.rescardno = rescardno;
} public Resume1(Integer resid, Users1 users1, String resname,
String rescardno) {
this.resid = resid;
this.users1 = users1;
this.resname = resname;
this.rescardno = rescardno;
} public Integer getResid() {
return resid;
} public void setResid(Integer resid) {
this.resid = resid;
} public Users1 getUsers1() {
return users1;
} public void setUsers1(Users1 users1) {
this.users1 = users1;
} 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;
} @Override
public String toString() {
return "Resume1 [rescardno=" + rescardno + ", resid=" + resid
+ ", resname=" + resname + ", users1=" + users1 + "]";
} }
Resume1.java
7.在项目的src的com.entity包下创建Resume1.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="com.entity.Resume1" table="RESUME1" schema="holly">
<!-- 主键配置 -->
<id name="resid" type="java.lang.Integer" column="RESID">
<!-- 主键由应用程序负责生成 -->
<generator class="assigned"/>
</id>
<!-- 部门名称 -->
<property name="resname" type="java.lang.String" column="RESNAME"/> <!-- 部门位置 -->
<property name="rescardno" type="java.lang.String" column="RESCARDNO"/>
<!-- 一个个档案对应一个人 -->
<!-- unique表示唯一约束,确保用户唯一 unique=true表示一一对应 -->
<many-to-one name="users1" class="com.entity.Users1" column="RESUSERID" cascade="all" unique="true"/>
</class>
</hibernate-mapping>
Resume1.hbm.xml
8.在项目的src的ccom.util包下创建HibernateUtil.java
package com.util; import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtil {
/**
* 创建线程池来管理Session
*/
private static ThreadLocal<Session> thread=new ThreadLocal<Session>();
/**
* 创建读取配置文件的对象
*/
private static Configuration config=null;
/**
* 创建获取Session的工厂
*/
private static SessionFactory factory=null; /**
* 读取配置文件
*/
static{
try {
config=new Configuration().configure("/hibernate.cfg.xml");
factory=config.buildSessionFactory();
} catch (HibernateException e) {
System.out.println("读取配置文件或创建SessionFactory失败!");
e.printStackTrace();
}
} /**
* 获取session
* @return
*/
public static Session getSession(){
Session session=thread.get();
if(session==null){
session=factory.openSession();
thread.set(session);
}
return session;
} /**
* 关闭Session
*/
public static void closeSession(){
Session session=thread.get();
thread.set(null);
session.close();
} }
HibernateUtil.java
9.在项目的src的com.dao包下创建Resume1Dao.java
package com.dao; import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.logging.SimpleFormatter; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction; import com.entity.Users1;
import com.entity.Resume1;
import com.util.HibernateUtil; public class Resume1Dao { public static void main(String[] args) {
//saveResume1();
loadResume1(); }
/**
* 2.立即加载:当查询档案信息时查询账号信息
*
*/
private static void loadResume1() {
Session session=HibernateUtil.getSession();
Resume1 resume1=(Resume1) session.get(Resume1.class, 1);
System.out.println("姓名:"+resume1.getResname());
System.out.println("用户名:"+resume1.getUsers1().getUsername()); HibernateUtil.closeSession(); }
/**
* 1.一对一 按照外键映射:级联操作,保存档案信息时,保存员工账号信息
* 1条查询sql,2条插入sql,查询sql见readme.txt
*/
private static void saveResume1() {
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
//创建员工档案对象
Resume1 resume1=new Resume1(1, "李四", "2014010101010"); //创建员工账户信息
Users1 users1=new Users1(1, "lisi", "123"); //给员工档案的users1对象赋值
resume1.setUsers1(users1); //给员工账号的resume1对象赋值
users1.setResume1(resume1); //添加员工档案信息时级联保存员工账号信息
session.save(resume1);
tx.commit();
System.out.println("添加成功"); HibernateUtil.closeSession(); } }
Resume1Dao.java
10.运行结果如下:
/**
* 1.一对一 按照外键映射:级联操作,保存档案信息时,保存员工账号信息
* 1条查询sql,2条插入sql,查询sql见readme.txt
*
*/
Hibernate:
select
users1x_.USERID,
users1x_.USERNAME as USERNAME1_,
users1x_.USERPASS as USERPASS1_
from
HOLLY.USERS1 users1x_
where
users1x_.USERID=?
Hibernate:
insert
into
HOLLY.USERS1
(USERNAME, USERPASS, USERID)
values
(?, ?, ?)
Hibernate:
insert
into
holly.RESUME1
(RESNAME, RESCARDNO, RESUSERID, RESID)
values
(?, ?, ?, ?)
/**
* 2.立即加载:当查询档案信息时查询账号信息
*/ Hibernate:
select
resume1x0_.RESID as RESID0_0_,
resume1x0_.RESNAME as RESNAME0_0_,
resume1x0_.RESCARDNO as RESCARDNO0_0_,
resume1x0_.RESUSERID as RESUSERID0_0_
from
holly.RESUME1 resume1x0_
where
resume1x0_.RESID=?
姓名:李四
Hibernate:
select
users1x0_.USERID as USERID1_1_,
users1x0_.USERNAME as USERNAME1_1_,
users1x0_.USERPASS as USERPASS1_1_,
resume1x1_.RESID as RESID0_0_,
resume1x1_.RESNAME as RESNAME0_0_,
resume1x1_.RESCARDNO as RESCARDNO0_0_,
resume1x1_.RESUSERID as RESUSERID0_0_
from
HOLLY.USERS1 users1x0_
left outer join
holly.RESUME1 resume1x1_
on users1x0_.USERID=resume1x1_.RESUSERID
where
users1x0_.USERID=?
Hibernate:
select
resume1x0_.RESID as RESID0_0_,
resume1x0_.RESNAME as RESNAME0_0_,
resume1x0_.RESCARDNO as RESCARDNO0_0_,
resume1x0_.RESUSERID as RESUSERID0_0_
from
holly.RESUME1 resume1x0_
where
resume1x0_.RESUSERID=?
用户名:lisi
readme.txt
二、Hibernate一对一按照主键查询
1.创建如下sql语句
create table RESUME2
(
RESID NUMBER(6) not null,
RESNAME VARCHAR2(20),
RESCARDNO VARCHAR2(20)
)
; create table USERS2
(
USERID NUMBER(6) not null,
USERNAME VARCHAR2(20) not null,
USERPASS VARCHAR2(20) not null
)
; alter table RESUME2
add constraint PK_RESUME2_RESID primary key (RESID); alter table USERS2
add constraint PK_USERS2_USERID primary key (USERID)
disable;
alter table USERS2
add constraint FK_USERS2_USERID foreign key (USERID)
references RESUME2 (RESID);
pk_one_to_one_.sql
2.项目的主配置,工具类,实体类都和上面一样,此处省略
3.在com.entity包下编辑Users2.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="com.pojo.Users2" table="USERS2">
<id name="usersid" type="java.lang.Integer" column="USERSID">
<!-- 双向一对一:按照外键关联映射配置 -->
<generator class="foreign">
<!-- 当前类User2外键列所关联的另一方Resume2类的对象属性名resume2 -->
<param name="property">resume2</param>
</generator>
</id>
<property name="usersname" type="java.lang.String" column="USERSNAME"/>
<property name="userspwd" type="java.lang.String" column="USERSPWD"/> <!-- 当前users2表中的usersid列又作为主键,又作为外键 -->
<one-to-one name="resume2" class="com.pojo.Resume2"
constrained="true" cascade="all"/>
</class>
</hibernate-mapping>
Users2.hbm.xml
4.在com.entity包下编辑Resume2.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="com.pojo.Resume2" table="RESUME2">
<id name="resid" type="java.lang.Integer" column="RESID">
<generator class="assigned"/>
</id>
<property name="resname" type="java.lang.String" column="RESNAME"/>
<property name="rescard" type="java.lang.String" column="RESCARD"/> <one-to-one name="users2" class="com.pojo.Users2"/> </class>
</hibernate-mapping>
Resume2.hbm.xml
5.在com.dao包下创建Test.java
package com.test; import org.hibernate.Session; import com.pojo.Resume2;
import com.pojo.Users2;
import com.util.HibernateUtil; public class Test {
public static void main(String[] args) {
//1.级联添加操作
//saveResumeToUsers();
//2.根据主键查询
loadResume(); }
/**
* 1.级联添加操作
Hibernate: select resume2x_.RESID, resume2x_.RESNAME as RESNAME0_, resume2x_.RESCARD as RESCARD0_ from RESUME2 resume2x_ where resume2x_.RESID=?
Hibernate: insert into RESUME2 (RESNAME, RESCARD, RESID) values (?, ?, ?)
Hibernate: insert into USERS2 (USERSNAME, USERSPWD, USERSID) values (?, ?, ?)
*/
private static void saveResumeToUsers() {
//1.获取session对象
Session session=HibernateUtil.getSession(); //2.创建瞬时对象
Users2 users1=new Users2(3, "倩倩", "123");
Resume2 resume1=new Resume2(3, "倩倩档案", "qianqian320112"); users1.setResume2(resume1);
resume1.setUsers2(users1); //3.级联添加
session.save(users1); session.beginTransaction().commit();
//4.提交事务
System.out.println("save cascade success...");
}
/**
Hibernate: select resume2x0_.RESID as RESID0_1_, resume2x0_.RESNAME as RESNAME0_1_, resume2x0_.RESCARD as RESCARD0_1_, users2x1_.USERSID as USERSID1_0_, users2x1_.USERSNAME as USERSNAME1_0_, users2x1_.USERSPWD as USERSPWD1_0_ from RESUME2 resume2x0_ left outer join USERS2 users2x1_ on resume2x0_.RESID=users2x1_.USERSID where resume2x0_.RESID=?
Resume2 [rescard=qianqian320112, resid=3, resname=倩倩档案]
Users2 [usersid=3, usersname=倩倩, userspwd=123]
*/
private static void loadResume() {
//1.获取session对象
Session session=HibernateUtil.getSession(); //2.根据主键去查询
//不会出现sql,xml默认就是延时记载
Resume2 resume1=(Resume2) session.load(Resume2.class, 3);
System.out.println(resume1);
System.out.println(resume1.getUsers2()); } }
Test.java
6.运行结果如下
9.hibernate的一对一映射的更多相关文章
- hibernate中一对一映射
一.hibernate中一对一映射有两种 1 主键方式,一张表的主键是通过另一张表的主键生成的 2 外键方式,一张表添加外键引用另一张表的主键,并添加唯一unique约束 二.下面进行简单例子,用户和 ...
- Hibernate的一对一映射
一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...
- Hibernate(七)一对一映射
一.创建数据库表 --班级表 create table grade ( gid number primary key, --班级ID gname ), --班级名称 gdesc ) --班级介绍 ); ...
- Hibernate表关系映射之一对一映射
一.数据表的映射关系 在数据库领域中,数据表和数据表之间关系一般可以分为如下几种: 一对一:比如公民和身份证的关系,一个人只有一张身份证,同时每张身份证也仅仅对应一个人! 一对多:比如客户和订单之间的 ...
- hibernate笔记--基于主键的单(双)向的一对一映射关系
上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ...
- hibernate笔记--基于外键的单(双)向的一对一映射关系
假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...
- Hibernate一对一映射关联
Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...
- Hibernate中的一对一映射
1.需求 用户和身份证是一一对应的关系. 有两种对应方式: 用户id作为身份证表的外键,身份证号作为主键: 用户id作为身份证表的主键: 2.实体Bean设计 User: public class U ...
- 【Hibernate 3】一对一映射配置
一.一对一映射简介 一对一关联映射有两种实现策略: 第一种:主键关联,即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联 ...
随机推荐
- oracle建表的时候同时创建主键,外键,注释,约束,索引
--主键create table emp (id number constraint id_pr primary key ,name1 varchar(8));create table emp9 (i ...
- C# 三角形外心和外接圆半径计算方法
在网上找了好久,想找一个现成的方法来用,折腾半天发现没有一个好用的,最后迫不得已自己写了一个,需要的同学可以直接拿去用, private void GetTriangleExcenterRadius( ...
- eclipse中debug快捷方式
eclipse中如何跳转到指定行 :ctrl+L 然后输入行数 F5:跳入方法 F6:向下逐行调试 F7:跳出方法 F8:直接跳转到下一个断点 持续更新
- EasyCHM(CHM电子书制作工具) v3.84.545 绿色版
软件名称:EasyCHM(CHM电子书制作工具) v3.84.545 绿色版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 2.78MB 图片预览: 软件 ...
- The property System
The property System 和其它编译器厂商一样, Qt 也提供了复杂的属性机制, 但是作为一个编译器无关.平台无关的库,Qt没有那些不被标准编译器支持的特征, 如 BCB的 __prop ...
- 圆形图片CustomShapeImageView
第三方控件 [GitHub的源码下载] (https://github.com/MostafaGazar/CustomShapeImageView) 1:依赖包 dependencies { ... ...
- Openjudge-NOI题库-字符串移位包含问题
题目描述 Description 对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串. 给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次 ...
- ubuntu 配置ftp服务器 vsftpd
1. 更新库,否则会可能有库过时不匹配报错. sudo apt-get update 2. 安装vsftpd sudo apt-get install vsftpd 3. 判断vsftpd是否安装成功 ...
- Framebuffer的配置及应用——先转载留着,以后一定要弄懂
http://blog.csdn.net/tju355/article/details/6881389 借助于framebuffer,我们能够在console下面作很多事情.首先下载framebu ...
- 找轮转后的有序数组中第K小的数
我们可以通过二分查找法,在log(n)的时间内找到最小数的在数组中的位置,然后通过偏移来快速定位任意第K个数. 此处假设数组中没有相同的数,原排列顺序是递增排列. 在轮转后的有序数组中查找最小数的算法 ...