Fork me on GitHub

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;
    }
    

}
View Code

学生证类

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;
    }

}
View Code

 

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>
View Code

学生证类配置文件 

<?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>
View Code

测试类

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

}
View Code

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

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

修改学生类的配置文件  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());
    }

}
View Code

 

posted @ 2015-03-14 02:33  森林森  阅读(1973)  评论(0编辑  收藏  举报