一、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. C#调用winhttp组件 POST登录迅雷

    下面是封装好的winhttp类 using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  2. leetcode & lintcode for bug-free

    刷题备忘录,for bug-free leetcode 396. Rotate Function 题意: Given an array of integers A and let n to be it ...

  3. 诡异的数学,数字问题 - leetcode

    134. Gas Station 那么这题包含两个问题: 1. 能否在环上绕一圈? 2. 如果能,这个起点在哪里? 第一个问题,很简单,我对diff数组做个加和就好了,leftGas = ∑diff[ ...

  4. Linux网络管理之net-tools VS iproute2

    查看网卡及IP ifconfig ip link [show] --------- ifconfig -a ip addr show 激活和停止网络接口 ifconfig eth0 up/down i ...

  5. 简单工厂设计模式(Simple Factory Design Pattern)

    [引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见 ...

  6. Unity3DGUI:GUILayout

    显示效果,注意GUILayout控件默认垂直布局,且在水平布局模块里控件大小默认按控件内容来显示,因此对于水平滑块HorizontalSlider来说需要自定义大小避免变形

  7. Anton and Tree

    Anton and Tree 题目链接:http://codeforces.com/contest/734/problem/E DFS/BFS 每一次操作都可以使连通的结点变色,所以可以将连通的点缩成 ...

  8. ASP.NET里面,如果设置了form的 onsubmit="return false;"之后,就不能提交按钮了?

    我的按钮是写成的服务器控件的形式<asp:Button ID="btnSubmitBR" runat="server" Text="提交&quo ...

  9. 【5】图解HTTP 笔记

    坚持.聪明.不畏困难,我将取得最后的胜利. 第一章 了解 Web 以网络基础 1. HTTP ( HyperText Transfer Protocol ): 超文本传输协议. 2. 通讯方式: 3. ...

  10. 使用vscode对c进行调试

    最近在学习C语言.知道vscode支持对c语言的代码的调试,就想试试.然后找了教程: https://code.visualstudio.com/docs/languages/cpp http://w ...