你的位置:首页 > Java教程

[Java教程]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.

<??><!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. />    <mapping resource="entity/Student.hbm. />    <mapping resource="entity/Paper.hbm. />  </session-factory></hibernate-configuration>

 

学生类配置文件

<??><!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

学生证类配置文件 

<??><!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类中的属性

<??><!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