一、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. MATLAB初体验

    好激动 要入MATLAB的大坑了 恩 很遗憾第一个程序并不是hello world 好 插入代码里并没有MATLAB这个选项 这是一种歧视 x=[:pi/:*pi]; y=sin(x); plot(x ...

  2. HDU 5873 Football Games

    随便判了几个条件就过了,也不知道对不对的. 正解应该是: $[1].$${s_1} + {s_2} + {s_3} + ...... + {s_n} = n(n - 1)$ $[2].$${s_1} ...

  3. Python Data Visualization Cookbook 2.9.2

    import numpy as np import matplotlib.pyplot as plt def is_outlier(points, threshold=3.5): if len(poi ...

  4. java模拟数据库缓存

    实现缓存一些数据到本地,避免重复查询数据库,对数据库造成压力,代码如下: package threadLock; import java.util.HashMap; import java.util. ...

  5. Jquery 2个数组,去除重复的项目

    长数组(Positions_Check) 短数组(PositionTitlesParent_Check) for (var i = 0; i < PositionTitlesParent_Che ...

  6. Android 6.0之权限管理

    安卓6.0的权限体系分为非敏感权限和敏感权限,非敏感权限默认获取,可以手动关闭. 敏感权限必须由app在运行时动态申请.而存储读写空间权限是一个敏感权限,不是一个“很正常的必须权限”. 安卓并不是想要 ...

  7. 1. LAMP----PHP开发环境搭建(Win)

    LAMP=Linux+Apache+MySQL+PHP. Step1 安装Apache http://httpd.apache.org/download.cgi 1.打开上面网址->点击File ...

  8. IBM Minus One

    IBM Minus One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  9. spring HttpServletRequest 简介

    前提:工作遇到controller中通过注解的方式注入 @Resourceprivate HttpServletRequest request;我们都知道spring 默认是单例,当遇到并发的时候线程 ...

  10. PHP单例模式--典型的三私一公

    单例模式:即一个类只被实例化一次,当其他人对其再次实例化时,便返回第一次实例化的对象.这种模式可以极大地节约资源.典型应用于数据库类的实例化. 以实例化一个Mysql数据库类为例: 要实现一个类只实例 ...