Hibernate(七)一对一映射

一、创建数据库表

--班级表
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());
    }

}

时间: 2024-10-06 00:10:42

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

9.hibernate的一对一映射

一.hibernate的一对一按照外键映射 1.创建如下sql脚本: 1 --员工账号表 2 create table USERS1 3 ( 4 USERID NUMBER(6) not null, 5 USERNAME VARCHAR2(20), 6 USERPASS VARCHAR2(20) 7 ) 8 ; 9 10 11 12 --档案表 13 create table RESUME1 14 ( 15 RESID NUMBER(6) not null, 16 RESUSERID NUMBE

Hibernate的一对一映射

一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configura

Hibernate的七种映射关系之七种关联映射(一)

关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一.Hibernate多对一关联映射:就是在"多"的一端加外键,指向"一"的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1."多"端实体加入引用"一"端实体的变量及getter,setter方法. 比如说多个学生对应一个班级,在学生实体类加入:private Grade grade; 2."多"端配置文

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

        ORM.全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象.以对象的形式展现.这样开发者就能够把对数据库的操作转化为对这些对象的操作.Hibernate正是实现了这样的思想,达到了方便开发者以面向对象的思想来实现对数据库的操作.    Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java).映射文件(*.hbm.xml)和数据库配置文件(*.properties/*.cfg.

Hibernate 的七种映射关系

关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一.Hibernate多对一关联映射:就是在"多"的一端加外键,指向"一"的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1."多"端实体加入引用"一"端实体的变量及getter,setter方法. 比如说多个学生对应一个班级,在学生实体类加入:private Grade grade; 2."多"端配置文

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

        ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作.Hibernate正是实现了这种思想,达到了方便开发人员以面向对象的思想来实现对数据库的操作.    Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java).映射文件(*.hbm.xml)和数据库配置文件(*.properties/*.cfg

Hibernate的七种映射关系之七种关联映射(二)

继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.private Classes classes; 2.Student.hbm.xml里添加many-to-one标签:<many-to-one name="classes" column="classesid"/>.Classes.hbm.xml在例子(六)里的那

(12)Hibernate一对一映射

只要你肯努力,没有什么事情是你不能搞砸的. 需求:一个汽车(Car)有一个引擎(Engine),它是一对一的映射关系. 对于一对一的映射,有两种实现方式:基于外键的映射和基于主键的映射.这两种方式学习的重点就是映射文件的配置,推荐使用第一种方式. 1.基于外键的映射 Car.java package com.rk.hibernate.k_one2one; public class Car { private int carId; private String carName; private E

hibernate的实体映射(一对一)

Hibernate的实体映射的主要任务就是实现数据库关系表与持久化类之间的映射,其关系如图: 双向映射一对一关联关系,通过唯一外键方式进行一对一关联映射,就是一个表的外键和另一个表的唯一主键对应形成一对一映射关系. 例如,以下例子,社团与社团负责人(社长),两者之间是一对一的关联关系: 持久化类association.java: public class Association implements java.io.Serializable{     private Integer id;