一、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的一对一映射的更多相关文章

  1. hibernate中一对一映射

    一.hibernate中一对一映射有两种 1 主键方式,一张表的主键是通过另一张表的主键生成的 2 外键方式,一张表添加外键引用另一张表的主键,并添加唯一unique约束 二.下面进行简单例子,用户和 ...

  2. Hibernate的一对一映射

    一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...

  3. Hibernate(七)一对一映射

    一.创建数据库表 --班级表 create table grade ( gid number primary key, --班级ID gname ), --班级名称 gdesc ) --班级介绍 ); ...

  4. Hibernate表关系映射之一对一映射

    一.数据表的映射关系 在数据库领域中,数据表和数据表之间关系一般可以分为如下几种: 一对一:比如公民和身份证的关系,一个人只有一张身份证,同时每张身份证也仅仅对应一个人! 一对多:比如客户和订单之间的 ...

  5. hibernate笔记--基于主键的单(双)向的一对一映射关系

    上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ...

  6. hibernate笔记--基于外键的单(双)向的一对一映射关系

    假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...

  7. Hibernate一对一映射关联

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

  8. Hibernate中的一对一映射

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

  9. 【Hibernate 3】一对一映射配置

    一.一对一映射简介 一对一关联映射有两种实现策略: 第一种:主键关联,即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联 ...

随机推荐

  1. 微信小程序前置课程:Flex 布局教程(一):语法篇

    原文:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool 网页布局(layout)是CSS的一个重点 ...

  2. JavaEE XML XPath

    JavaEE XML XPath @author ixenos XPath技术 1 引入 问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!!需要遍历DOM树的众多节点 ...

  3. Linux学习初步

    centOS 6.5关闭防火墙步骤  关闭命令:  service iptables stop         永久关闭防火墙:chkconfig iptables off两个命令同时运行,运行完成后 ...

  4. MariaDB数据解压版安装(10.0.16)

    官网下载地址:https://downloads.mariadb.org/    (自己选择版本下载) 在windows 7 下安装 1.下载到解压版安装文件mariadb-10.0.16-win32 ...

  5. Python学习笔记——基础篇【第六周】——hashlib模块

    常用模块之hashlib模块 用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 import ...

  6. ASP.NET Calendar(日历控件)

    定义和用法 Calendar 控件用于在浏览器中显示日历. 该控件可显示某个月的日历,允许用户选择日期,也可以跳到前一个或下一个月. 属性 属性 描述 .NET Caption 日历的标题. 2.0 ...

  7. eclipse 导入tomcat7源码

    导入tomcat的源码其实说简单也不简单,说不简单也简单,主要还是环境问题,中间花费了我很多时间,网上找了很多都没什么用,参考一些文章,然后自己慢慢摸索出来的. 环境:(1)jdk:jdk1.6.0_ ...

  8. 移动端audio自动播放问题

    中秋临近,心血来潮想做个手机端贺卡,以前接触的移动端较少,虽然是个简单的贺卡,其实也蛮多坑的,简略说一下在制作贺卡的过程遇到的坑: 一:移动端的屏幕大小不能算作body的大小,因为手机浏览器头部都有网 ...

  9. Linux监控工具vmstat命令详解

        一.前言 很显然从名字中我们就可以知道vmstat是一个查看虚拟内存(Virtual Memory)使用状况的工具,但是怎样通过vmstat来发现系统中的瓶颈呢?在回答这个问题前,还是让我们回 ...

  10. QTP脚本汇总比较有价值

    1.Object Spy的Tips Hold the CTRL key to change the window focus or perform other mouse operations  2. ...