一、创建数据库表

--班级表
create table grade
(
gid number primary key, --班级ID
gname varchar2(50), --班级名称
gdesc varchar2(50) --班级介绍
);
--学生表
create table student
(
sid number primary key, --主键ID学生ID
sname varchar2(20), --学生姓名
sex varchar2(20), --学生性别
gid number references grade(gid) ---外键班级ID
); --学生证表
create table paper
(
pid number primary key,
pdesc varchar2(100) ,
sid number references student(sid) not null );

二、创建配置文件和持久化类

学生类

package entity;

/*
* 学生类
*/
public class Student implements java.io.Serializable { // Fields private static final long serialVersionUID = 1L;
private int sid;
private String sname;
private String sex;
//增加班级属性
private Grade grade;
//学生证类
private Paper paper; // Constructors /** default constructor */
public Student() {
} /** minimal constructor */
public Student(int sid) {
this.sid = sid;
} /** full constructor */
public Student(int sid, String sname, String sex ) { this.sid = sid; this.sname = sname;
this.sex = sex;
} // Property accessors public int getSid() {
return this.sid;
} public void setSid(int sid) {
this.sid = sid;
} public String getSname() {
return this.sname;
} public void setSname(String sname) {
this.sname = sname;
} public String getSex() {
return this.sex;
} public void setSex(String sex) {
this.sex = sex;
} public Grade getGrade() {
return grade;
} public void setGrade(Grade grade) {
this.grade = grade;
} public Paper getPaper() {
return paper;
} public void setPaper(Paper paper) {
this.paper = paper;
} }

学生证类

package entity;

/*
* 学生证类
*/ public class Paper implements java.io.Serializable { // Fields private static final long serialVersionUID = 1L;
private int pid;
private Student student;
private String pdesc; // Constructors /** default constructor */
public Paper() {
} /** minimal constructor */
public Paper(int pid) {
this.pid = pid;
} /** full constructor */
public Paper(int pid, Student student, String pdesc) {
this.pid = pid;
this.student = student;
this.pdesc = pdesc;
} // Property accessors public int getPid() {
return this.pid;
} public void setPid(int pid) {
this.pid = pid;
} public Student getStudent() {
return this.student;
} public void setStudent(Student student) {
this.student = student;
} public String getPdesc() {
return this.pdesc;
} public void setPdesc(String pdesc) {
this.pdesc = pdesc;
} }

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="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:orcl
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">
oracle.jdbc.OracleDriver
</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property> <mapping resource="entity/Grade.hbm.xml" />
<mapping resource="entity/Student.hbm.xml" />
<mapping resource="entity/Paper.hbm.xml" /> </session-factory> </hibernate-configuration>

学生类配置文件

<?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="entity.Student" table="STUDENT" schema="ROOT">
<id name="sid" type="java.lang.Integer">
<column name="SID" precision="22" scale="0" />
<generator class="assigned" />
</id>
<property name="sname" type="java.lang.String">
<column name="SNAME" length="20" />
</property>
<property name="sex" type="java.lang.String">
<column name="SEX" length="20" />
</property>
<!--配置grade属性 -->
<many-to-one name="grade" class="entity.Grade" cascade="save-update">
<!--指定学生表中的外键 -->
<column name="GID" />
</many-to-one>
<!-- 添加学生证的配置 -->
<one-to-one name="paper" class="entity.Paper" cascade="all" lazy="false"/>
</class>
</hibernate-mapping>

学生证类配置文件

<?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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="entity.Paper" table="PAPER" schema="ROOT">
<id name="pid" type="java.lang.Integer">
<column name="PID" precision="22" scale="0" />
<generator class="assigned" />
</id> <property name="pdesc" type="java.lang.String">
<column name="PDESC" length="100" />
</property>
<!-- 学生信息 unique唯一的-->
<many-to-one name="student" class="entity.Student" unique="true" lazy="false">
<column name="SID" precision="22" scale="0" />
</many-to-one>
</class>
</hibernate-mapping>

测试类

package Test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; import entity.Paper;
import entity.Student; public class Demo6 { public static void main(String[] args) {
save();
find();
} public static void save() { Student stu1 = new Student();
stu1.setSid(20151109);
stu1.setSname("钱七");
stu1.setSex("女"); Paper paper=new Paper();
paper.setPid(9001);
paper.setPdesc("钱七的学生证");
paper.setStudent(stu1); stu1.setPaper(paper); // 建立session
Session session = new Configuration().configure().buildSessionFactory()
.openSession();
// 开始事务
Transaction transaction = session.beginTransaction(); // 保存学生证
session.save(stu1);
// 提交事务
transaction.commit();
// 关闭session
session.close(); } public static void find() {
// 建立session
Session session = new Configuration().configure().buildSessionFactory()
.openSession();
Paper paper=(Paper) session.get(Paper.class, 9001);
System.out.println(paper.getPid()+paper.getPdesc());
Student stu1=paper.getStudent();
System.out.println(stu1.getSid()+"\t"+stu1.getSname());
} }

发现可以 通过学生证,找到学生

但反过来,如果通过学生,找到学生证呢,显示是不能的,因为学生类中配置文件没有实现关联

修改学生类的配置文件  property-ref="student"用来指定Paper类中的属性

<?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="entity.Student" table="STUDENT" schema="ROOT">
<id name="sid" type="java.lang.Integer">
<column name="SID" precision="22" scale="0" />
<generator class="assigned" />
</id>
<property name="sname" type="java.lang.String">
<column name="SNAME" length="20" />
</property>
<property name="sex" type="java.lang.String">
<column name="SEX" length="20" />
</property>
<!--配置grade属性 -->
<many-to-one name="grade" class="entity.Grade" cascade="save-update">
<!--指定学生表中的外键 -->
<column name="GID" />
</many-to-one>
<!-- 添加学生证的配置 -->
<one-to-one name="paper" class="entity.Paper" cascade="all" lazy="false" property-ref="student"/>
</class>
</hibernate-mapping>

测试类

package Test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; import entity.Paper;
import entity.Student; public class Demo6 { public static void main(String[] args) {
findByStu();
} public static void save() { Student stu1 = new Student();
stu1.setSid(20151109);
stu1.setSname("钱七");
stu1.setSex("女"); Paper paper=new Paper();
paper.setPid(9001);
paper.setPdesc("钱七的学生证");
paper.setStudent(stu1); stu1.setPaper(paper); // 建立session
Session session = new Configuration().configure().buildSessionFactory()
.openSession();
// 开始事务
Transaction transaction = session.beginTransaction(); // 保存学生证
session.save(stu1);
// 提交事务
transaction.commit();
// 关闭session
session.close(); } public static void find() {
// 建立session
Session session = new Configuration().configure().buildSessionFactory()
.openSession();
Paper paper=(Paper) session.get(Paper.class, 9001);
System.out.println(paper.getPid()+paper.getPdesc());
Student stu1=paper.getStudent();
System.out.println(stu1.getSid()+"\t"+stu1.getSname());
}
public static void findByStu() {
// 建立session
Session session = new Configuration().configure().buildSessionFactory()
.openSession();
Student stu=(Student) session.get(Student.class, 20151109);
System.out.println(stu.getSname());
Paper paper=stu.getPaper();
System.out.println(paper.getPid()+"\t"+paper.getPdesc());
} }

Hibernate(七)一对一映射的更多相关文章

  1. hibernate中一对一映射

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

  2. 9.hibernate的一对一映射

    一.hibernate的一对一按照外键映射 1.创建如下sql脚本: --员工账号表 create table USERS1 ( USERID ) not null, USERNAME ), USER ...

  3. Hibernate的一对一映射

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

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

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

  5. Hibernate映射解析——七种映射关系

    首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对 ...

  6. SSH深度历险(一)深入浅出Hibernate架构(一)-------映射解析——七种映射关系

            ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据 ...

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

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

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

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

  9. Hibernate一对一映射关联

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

随机推荐

  1. centos7下redis-2.8.13安装笔记

    安装gcc 执行命令:yum install gcc 中间有两次提示,要求输入:yes 或 y,我们按照提示来就可以 至此安装成功 注意:如果不装gcc,解压redis后执行make命令会报错,如下图 ...

  2. 【原】不定义Order属性,通过切面类的定义顺序来决定通知执行的先后顺序

    [结论] 在多个切面类的“切入点相同”并且每个切面都“没有定义order属性”的情况下,则切面类(中的通知)的执行顺序与该切面类在<aop:config>元素中“声明的顺序”相关,即先声明 ...

  3. Oracle问题诊断过程常用SQL

    --查看临时表空间使用情况select tablespace_name ,sum(size_mb),sum(used_mb),round(sum(used_mb)/sum(size_mb),2) fr ...

  4. IP配制

    http://blog.csdn.net/laoyiin/article/details/5722977

  5. QT 安装 4.8.7 on solaris 10

    1.  下载 QT 4.8.7: http://download.qt.io/official_releases/qt/4.8/4.8.7/qt-everywhere-opensource-src-4 ...

  6. NHibernate的调试技巧和Log4Net配置

    1.查看nhibernate写在控制台里的sql语句 在配置文件中有这么个选项,假如把它设置为true,nhibernate会把执行的sql显示在控制台上. <property name=&qu ...

  7. JVM内存模型及垃圾回收算法

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. NGUI 3.5教程(一)安装NGUI 3.5.8

    写在前面: 网上找的NGUI教程,都是基于2.x版本号的.为了能配合教程学着做,我也是下载了各种NGUI 2.x版本号.可是在导入的时候,或多或少都报错(我用的Unity 的版本号是4.3.2).无奈 ...

  9. Android之开源中国客户端源码分析(二)

    1. 加载动画圈实现 <ProgressBar android:id="@+id/main_head_progress" style="@style/loading ...

  10. Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程

    在本系列的上一篇文章中,我们学习了Glide的基本用法,体验了这个图片加载框架的强大功能,以及它非常简便的API.还没有看过上一篇文章的朋友,建议先去阅读 Android图片加载框架最全解析(一),G ...