一、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. 前端——HTML笔记Two

    web前端需要掌握:HTML.CSS.JavaScript语言.这三门技术用来实现: 1. HTML是网页内容的载体.内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字.图片.视频等. 2 ...

  2. 学习Sass(二)

    前面简单介绍了sass的安装,特点和使用方法等,这里记录下sass的基本语法. 1.变量 2.运算 3.嵌套 4.代码复用 5.高级语法 6.自定义函数 一.变量 变量以$开始,像css属性那样赋值, ...

  3. gamma

    图:显卡(驱动程序)上的Gamma设置 图:ACDSEE中的曝光调节 二. 什么是Gamma? 2.1. 显示器Gamma曲线 Gamma可能源于CRT(显示器/电视机)的响应曲线,即其亮度与输入电压 ...

  4. equals和hashcode为什么要一起重写

    equals()方法与hashCode()的通用协定是:2.1 如果两个对象相等(equal),那么必须拥有相同的哈希码(hash code)2.2 即使两个对象有相同的哈希值(hash code), ...

  5. Unity3d请求webservice

    我们在对接第三方sdk时,第三方sdk通常会以一个webservice接口的形式供我们来调用.而这些接口会以提供我们get,post,soap等协议来进行访问.get,post方法相信大家都比较熟悉了 ...

  6. POJ 3507 Judging Olympia

    小技巧 判断 全部为零 用sign和所有元素依次取或 排除最大项和最小项 直接排序后取中间的四个元素 http://poj.org/problem?id=3507 1 #include <ios ...

  7. HTTP 错误 404.8 - Not Found

    HTTP 错误 404.8 - Not Found请求筛选模块被配置为拒绝包含 hiddenSegment 节的 URL 中的路径. 详细错误信息模块 RequestFilteringModule 通 ...

  8. 前端 TDD 开发

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px ".PingFang SC"; color: #454545 } p.p2 ...

  9. spring-事务实现原理

    spring事务的实现原理:aop. aop的两种实现方式: 1.动态代理: 事务方法与调用方法不能在同一个类中,否则事务不生效.解决方案,自己注入自己(实质注入的是代理类). 实现方式:jdk动态代 ...

  10. .net程序在无.net环境下运行

    看了篇文章  测试了下竟然真的可以运行  测试环境是XP下  没有装NET2.0的情况下 可以运行的   不过需要每次输入命令才能运行 点击后还是会报错 原文如下 众所周知,.net程序必须运行在.n ...