加载中...

Hibernate(七)一对一映射


一、创建数据库表

  1. --班级表
  2. create table grade
  3. (
  4. gid number primary key, --班级ID
  5. gname varchar2(50), --班级名称
  6. gdesc varchar2(50) --班级介绍
  7. );
  8. --学生表
  9. create table student
  10. (
  11. sid number primary key, --主键ID学生ID
  12. sname varchar2(20), --学生姓名
  13. sex varchar2(20), --学生性别
  14. gid number references grade(gid) ---外键班级ID
  15. );
  16. --学生证表
  17. create table paper
  18. (
  19. pid number primary key,
  20. pdesc varchar2(100) ,
  21. sid number references student(sid) not null
  22. );

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

学生类

  1. package entity;
  2. /*
  3. * 学生类
  4. */
  5. public class Student implements java.io.Serializable {
  6. // Fields
  7.  
  8. private static final long serialVersionUID = 1L;
  9. private int sid;
  10. private String sname;
  11. private String sex;
  12. //增加班级属性
  13. private Grade grade;
  14. //学生证类
  15. private Paper paper;
  16. // Constructors
  17.  
  18. /** default constructor */
  19. public Student() {
  20. }
  21. /** minimal constructor */
  22. public Student(int sid) {
  23. this.sid = sid;
  24. }
  25. /** full constructor */
  26. public Student(int sid, String sname, String sex ) {
  27. this.sid = sid;
  28. this.sname = sname;
  29. this.sex = sex;
  30. }
  31. // Property accessors
  32.  
  33. public int getSid() {
  34. return this.sid;
  35. }
  36. public void setSid(int sid) {
  37. this.sid = sid;
  38. }
  39. public String getSname() {
  40. return this.sname;
  41. }
  42. public void setSname(String sname) {
  43. this.sname = sname;
  44. }
  45. public String getSex() {
  46. return this.sex;
  47. }
  48. public void setSex(String sex) {
  49. this.sex = sex;
  50. }
  51. public Grade getGrade() {
  52. return grade;
  53. }
  54. public void setGrade(Grade grade) {
  55. this.grade = grade;
  56. }
  57. public Paper getPaper() {
  58. return paper;
  59. }
  60. public void setPaper(Paper paper) {
  61. this.paper = paper;
  62. }
  63. }
View Code

学生证类

  1. package entity;
  2. /*
  3. * 学生证类
  4. */
  5.  
  6. public class Paper implements java.io.Serializable {
  7. // Fields
  8.  
  9. private static final long serialVersionUID = 1L;
  10. private int pid;
  11. private Student student;
  12. private String pdesc;
  13. // Constructors
  14.  
  15. /** default constructor */
  16. public Paper() {
  17. }
  18. /** minimal constructor */
  19. public Paper(int pid) {
  20. this.pid = pid;
  21. }
  22. /** full constructor */
  23. public Paper(int pid, Student student, String pdesc) {
  24. this.pid = pid;
  25. this.student = student;
  26. this.pdesc = pdesc;
  27. }
  28. // Property accessors
  29.  
  30. public int getPid() {
  31. return this.pid;
  32. }
  33. public void setPid(int pid) {
  34. this.pid = pid;
  35. }
  36. public Student getStudent() {
  37. return this.student;
  38. }
  39. public void setStudent(Student student) {
  40. this.student = student;
  41. }
  42. public String getPdesc() {
  43. return this.pdesc;
  44. }
  45. public void setPdesc(String pdesc) {
  46. this.pdesc = pdesc;
  47. }
  48. }
View Code

 

hibernate.cfg.xml配置文件

  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5.  
  6. <hibernate-configuration>
  7.  
  8. <session-factory>
  9. <property name="dialect">
  10. org.hibernate.dialect.Oracle9Dialect
  11. </property>
  12. <property name="connection.url">
  13. jdbc:oracle:thin:@localhost:1521:orcl
  14. </property>
  15. <property name="connection.username">root</property>
  16. <property name="connection.password">root</property>
  17. <property name="connection.driver_class">
  18. oracle.jdbc.OracleDriver
  19. </property>
  20. <property name="show_sql">true</property>
  21. <property name="format_sql">true</property>
  22.  
  23. <mapping resource="entity/Grade.hbm.xml" />
  24. <mapping resource="entity/Student.hbm.xml" />
  25. <mapping resource="entity/Paper.hbm.xml" />
  26.  
  27. </session-factory>
  28.  
  29. </hibernate-configuration>

 

学生类配置文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4.  
  5. <hibernate-mapping>
  6. <class name="entity.Student" table="STUDENT" schema="ROOT">
  7. <id name="sid" type="java.lang.Integer">
  8. <column name="SID" precision="22" scale="0" />
  9. <generator class="assigned" />
  10. </id>
  11. <property name="sname" type="java.lang.String">
  12. <column name="SNAME" length="20" />
  13. </property>
  14. <property name="sex" type="java.lang.String">
  15. <column name="SEX" length="20" />
  16. </property>
  17. <!--配置grade属性 -->
  18. <many-to-one name="grade" class="entity.Grade" cascade="save-update">
  19. <!--指定学生表中的外键 -->
  20. <column name="GID" />
  21. </many-to-one>
  22. <!-- 添加学生证的配置 -->
  23. <one-to-one name="paper" class="entity.Paper" cascade="all" lazy="false"/>
  24. </class>
  25. </hibernate-mapping>
View Code

学生证类配置文件 

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <!--
  5. Mapping file autogenerated by MyEclipse Persistence Tools
  6. -->
  7. <hibernate-mapping>
  8. <class name="entity.Paper" table="PAPER" schema="ROOT">
  9. <id name="pid" type="java.lang.Integer">
  10. <column name="PID" precision="22" scale="0" />
  11. <generator class="assigned" />
  12. </id>
  13. <property name="pdesc" type="java.lang.String">
  14. <column name="PDESC" length="100" />
  15. </property>
  16. <!-- 学生信息 unique唯一的-->
  17. <many-to-one name="student" class="entity.Student" unique="true" lazy="false">
  18. <column name="SID" precision="22" scale="0" />
  19. </many-to-one>
  20. </class>
  21. </hibernate-mapping>
View Code

测试类

  1. package Test;
  2. import org.hibernate.Session;
  3. import org.hibernate.Transaction;
  4. import org.hibernate.cfg.Configuration;
  5. import entity.Paper;
  6. import entity.Student;
  7. public class Demo6 {
  8. public static void main(String[] args) {
  9. save();
  10. find();
  11. }
  12. public static void save() {
  13. Student stu1 = new Student();
  14. stu1.setSid(20151109);
  15. stu1.setSname("钱七");
  16. stu1.setSex("女");
  17. Paper paper=new Paper();
  18. paper.setPid(9001);
  19. paper.setPdesc("钱七的学生证");
  20. paper.setStudent(stu1);
  21. stu1.setPaper(paper);
  22. // 建立session
  23. Session session = new Configuration().configure().buildSessionFactory()
  24. .openSession();
  25. // 开始事务
  26. Transaction transaction = session.beginTransaction();
  27. // 保存学生证
  28. session.save(stu1);
  29. // 提交事务
  30. transaction.commit();
  31. // 关闭session
  32. session.close();
  33. }
  34. public static void find() {
  35. // 建立session
  36. Session session = new Configuration().configure().buildSessionFactory()
  37. .openSession();
  38. Paper paper=(Paper) session.get(Paper.class, 9001);
  39. System.out.println(paper.getPid()+paper.getPdesc());
  40. Student stu1=paper.getStudent();
  41. System.out.println(stu1.getSid()+"\t"+stu1.getSname());
  42. }
  43. }
View Code

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

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

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4.  
  5. <hibernate-mapping>
  6. <class name="entity.Student" table="STUDENT" schema="ROOT">
  7. <id name="sid" type="java.lang.Integer">
  8. <column name="SID" precision="22" scale="0" />
  9. <generator class="assigned" />
  10. </id>
  11. <property name="sname" type="java.lang.String">
  12. <column name="SNAME" length="20" />
  13. </property>
  14. <property name="sex" type="java.lang.String">
  15. <column name="SEX" length="20" />
  16. </property>
  17. <!--配置grade属性 -->
  18. <many-to-one name="grade" class="entity.Grade" cascade="save-update">
  19. <!--指定学生表中的外键 -->
  20. <column name="GID" />
  21. </many-to-one>
  22. <!-- 添加学生证的配置 -->
  23. <one-to-one name="paper" class="entity.Paper" cascade="all" lazy="false" property-ref="student"/>
  24. </class>
  25. </hibernate-mapping>

测试类

  1. package Test;
  2. import org.hibernate.Session;
  3. import org.hibernate.Transaction;
  4. import org.hibernate.cfg.Configuration;
  5. import entity.Paper;
  6. import entity.Student;
  7. public class Demo6 {
  8. public static void main(String[] args) {
  9. findByStu();
  10. }
  11. public static void save() {
  12. Student stu1 = new Student();
  13. stu1.setSid(20151109);
  14. stu1.setSname("钱七");
  15. stu1.setSex("女");
  16. Paper paper=new Paper();
  17. paper.setPid(9001);
  18. paper.setPdesc("钱七的学生证");
  19. paper.setStudent(stu1);
  20. stu1.setPaper(paper);
  21. // 建立session
  22. Session session = new Configuration().configure().buildSessionFactory()
  23. .openSession();
  24. // 开始事务
  25. Transaction transaction = session.beginTransaction();
  26. // 保存学生证
  27. session.save(stu1);
  28. // 提交事务
  29. transaction.commit();
  30. // 关闭session
  31. session.close();
  32. }
  33. public static void find() {
  34. // 建立session
  35. Session session = new Configuration().configure().buildSessionFactory()
  36. .openSession();
  37. Paper paper=(Paper) session.get(Paper.class, 9001);
  38. System.out.println(paper.getPid()+paper.getPdesc());
  39. Student stu1=paper.getStudent();
  40. System.out.println(stu1.getSid()+"\t"+stu1.getSname());
  41. }
  42. public static void findByStu() {
  43. // 建立session
  44. Session session = new Configuration().configure().buildSessionFactory()
  45. .openSession();
  46. Student stu=(Student) session.get(Student.class, 20151109);
  47. System.out.println(stu.getSname());
  48. Paper paper=stu.getPaper();
  49. System.out.println(paper.getPid()+"\t"+paper.getPdesc());
  50. }
  51. }
View Code

 


还没有评论.