3e32q

 

内蒙古工业大学

数据科学与应用学院

 

 

课程名称:  Java Web开发框架技术       

实验名称:  使用hibernate实现关系映射  

实验类型:验证性R综合性□设计性□

实验室名称:    计算机应用实验室        

班级 软件15-3  学号   201520205043     

姓名 朱学良  成绩:_________________

实验日期:    2018年5月29            

 

报告类型:实验报告  预习报告

报告成绩:         指导教师审核(签名):                          

1、实验目的

(1) 理解什么是单向、双向、多对一、一对多的含义

(2) 掌握hibernate一对多映射关系

2、实验设备与环境

硬件:安装有Windows XP/7/8系统的微机一台。

软件:JDK1.6以上、MyEclipse 8.0以上oracle9i以上

3、实验内容

(1) 使用hibernate配置文件创建学生信息表(学号、姓名、性别、出生日期、班级)、班级信息表(班级编号、班级名称、开班日期)

(2) 使用hibernate完成两表的主外键关联。

(3) 将配置文件配置成单向多对一,完成对班级和学生信息的增删改查。

(4) 将配置文件配置成双向一对多,完成学生的增删改查。班级的增、删。4、4、实验要求

(1) 实验前书写预习报告,包括类图和方法的代码描述。

(2) 记录程序调试中出现的问题和解决方法。

(3) 实验后必须按照要求独立完成实验报告。

(4) 打印源程序清单和测试结果附在实验报告的后面。

5、代码

项目预览
用到JAR包
代码

①/day_0529_01/src/hibernate.cfg.xml

[html] view plain copy

  1. <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">  
  2. <hibernate-configuration>  
  3. <session-factory>  
  4. <!-- 配置访问Oracle数据库参数信息 -->  
  5. <property name="dialect">  
  6. org.hibernate.dialect.MySQLDialect  
  7. </property>  
  8. <property name="connection.driver_class">  
  9. com.mysql.jdbc.Driver  
  10. </property>  
  11. <property name="connection.url">  
  12. jdbc:mysql://39.105.54.45:3306/test?useUnicod=true&characterEncoding=utf-8  
  13. </property>  
  14. <property name="connection.username">root</property>  
  15. <property name="connection.password">123</property>  
  16. <!-- 在控制台显示SQL语句 -->  
  17. <property name="show_sql">true</property>  
  18. <!-- format_sql:操作数据库时,会先将sql语句格式化 -->  
  19. <property name="format_sql">true</property>  
  20. <!--根据需要自动生成、更新数据表 -->  
  21. <property name="hbm2ddl.auto">update</property>  
  22. <!-- 注册所有ORM映射文件 -->  
  23. <mapping resource="cn/edu/imut/beans/Grade.hbm.xml" />  
  24. <mapping resource="cn/edu/imut/beans/Student.hbm.xml" />  
  25. </session-factory>  
  26. </hibernate-configuration>  

②/day_0529_01/src/cn/edu/imut/utils/HibernateUtils.java

[java] view plain copy

  1. package cn.edu.imut.utils;  
  2. import org.hibernate.HibernateException;  
  3. import org.hibernate.Session;  
  4. import org.hibernate.SessionFactory;  
  5. import org.hibernate.boot.registry.StandardServiceRegistryBuilder;  
  6. import org.hibernate.cfg.Configuration;  
  7. public class HibernateUtils {  
  8. private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";  
  9. private static final ThreadLocal<Session> threadLocal   
  10. new ThreadLocal<Session>();  
  11. private static Configuration configuration = new Configuration();  
  12. private static StandardServiceRegistryBuilder standardServiceRegistryBuilder = new StandardServiceRegistryBuilder();  
  13. private static SessionFactory sessionFactory;  
  14. private static String configFile = CONFIG_FILE_LOCATION;  
  15. /* 静态代码块创建SessionFactory */  
  16. static {  
  17. try {  
  18. configuration.configure(configFile);  
  19. //Hibernate4.3创建SessionFactory的方式  
  20. standardServiceRegistryBuilder.applySettings(configuration.getProperties());  
  21. sessionFactory = configuration.buildSessionFactory(standardServiceRegistryBuilder.build());  
  22. catch (Exception e) {  
  23. System.err.println("%%%% Error Creating SessionFactory %%%%");  
  24. e.printStackTrace();  
  25. }  
  26. }  
  27. private HibernateUtils() {  
  28. }  
  29. /** 
  30. * 返回ThreadLocal中的session实例 
  31. */  
  32. public static Session getSession() throws HibernateException {  
  33. Session session = (Session) threadLocal.get();  
  34. if (session == null || !session.isOpen()) {  
  35. if (sessionFactory == null) {  
  36. rebuildSessionFactory();  
  37. }  
  38. session = (sessionFactory != null) ? sessionFactory.openSession()  
  39. null;  
  40. threadLocal.set(session);  
  41. }  
  42. return session;  
  43. }  
  44. /** 
  45. * 返回Hibernate的SessionFactory 
  46. */  
  47. public static void rebuildSessionFactory() {  
  48. try {  
  49. configuration.configure(configFile);  
  50. sessionFactory = configuration.buildSessionFactory(standardServiceRegistryBuilder.build());  
  51. catch (Exception e) {  
  52. System.err.println("%%%% Error Creating SessionFactory %%%%");  
  53. e.printStackTrace();  
  54. }  
  55. }  
  56. /** 
  57. * 关闭Session实例并且把ThreadLocal中副本清除 
  58. */  
  59. public static void closeSession() throws HibernateException {  
  60. Session session = (Session) threadLocal.get();  
  61. threadLocal.set(null);  
  62. if (session != null) {  
  63. session.close();  
  64. }  
  65. }  
  66. /** 
  67. * 返回SessionFactory 
  68. */  
  69. public static SessionFactory getSessionFactory() {  
  70. return sessionFactory;  
  71. }  
  72. public static void setConfigFile(String configFile) {  
  73. HibernateUtils.configFile = configFile;  
  74. sessionFactory = null;  
  75. }  
  76. public static Configuration getConfiguration() {  
  77. return configuration;  
  78. }  
  79. }  

③/day_0529_01/src/cn/edu/imut/beans/Student.hbm.xml

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="cn.edu.imut.beans">  
  6. <class name="Student" table="t_student">  
  7. <!-- 学生学号主键 -->  
  8. <id name="studentId" column="student_id">  
  9. <generator class="native" />  
  10. </id>  
  11. <!-- 姓名 -->  
  12. <property name="studentName" column="student_name" />  
  13. <!-- 性别 -->  
  14. <property name="studentSex" column="student_sex" />  
  15. <!-- 出生日期 -->  
  16. <property name="studentBirth" column="student_birth" />  
  17. <!--单向 N-1 -->  
  18. <many-to-one name="grade" class="Grade" column="grade_id"/>  
  19. </class>  
  20. </hibernate-mapping>  

④/day_0529_01/src/cn/edu/imut/beans/Student.java

[java] view plain copy

  1. package cn.edu.imut.beans;  
  2. public class Student {  
  3. private Integer studentId;//学号  
  4. private String studentName;//姓名  
  5. private String studentSex;//性别  
  6. private String studentBirth;//出生日期  
  7. private Grade grade;//班级  
  8. public Student() {  
  9. super();  
  10. // TODO Auto-generated constructor stub  
  11. }  
  12. public Student(String studentName, String studentSex, String studentBirth) {  
  13. super();  
  14. this.studentName = studentName;  
  15. this.studentSex = studentSex;  
  16. this.studentBirth = studentBirth;  
  17. }  
  18. //省略get和set方法 
  19. @Override  
  20. public String toString() {  
  21. return "Student [studentId=" + studentId + ", studentName=" + studentName + ", studentSex=" + studentSex  
  22. + ", studentBirth=" + studentBirth + ", grade=" + grade + "]";  
  23. }  
  24. }  

⑤/day_0529_01/src/cn/edu/imut/beans/Grade.hbm.xml

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="cn.edu.imut.beans">  
  6. <class name="Grade" table="t_grade">  
  7. <!-- 班级编号主键 -->  
  8. <id name="gradeId" column="grade_id">  
  9. <!-- 主键生成策略为native -->  
  10. <generator class="native" />  
  11. </id>  
  12. <!-- 班级名称 -->  
  13. <property name="gradeName" column="grade_name" type="string"  
  14. not-null="true" />  
  15. <!-- 开班日期 -->  
  16. <property name="gradeBirth" column="grade_birth" type="string"  
  17. not-null="true" />  
  18. <!-- 做单向时请注释掉 -->  
  19. <set name="student" table="t_grade">  
  20. <key column="grade_id" />  
  21. <one-to-many class="Student" />  
  22. </set>  
  23. </class>  
  24. </hibernate-mapping>  

⑥/day_0529_01/src/cn/edu/imut/beans/Grade.java

[java] view plain copy

  1. package cn.edu.imut.beans;  
  2. import java.util.HashSet;  
  3. import java.util.Set;  
  4. public class Grade {  
  5. private Long gradeId;//班级编号  
  6. private String gradeName;//班级名称  
  7. private String gradeBirth;//开班日期  
  8. //做单向时请注释掉  
  9. private Set<Student> student = new HashSet<Student>();  
  10. public Grade() {  
  11. super();  
  12. // TODO Auto-generated constructor stub  
  13. }  
  14. public Grade(String gradeName, String gradeBirth) {  
  15. super();  
  16. this.gradeName = gradeName;  
  17. this.gradeBirth = gradeBirth;  
  18. }  
  19. //省略get和set方法  
  20. @Override  
  21. public String toString() {  
  22. return "Grade [gradeId=" + gradeId + ", gradeName=" + gradeName + ", gradeBirth=" + gradeBirth + "]";  
  23. }  
  24. }  

⑦/day_0529_01/src/cn/edu/imut/test/HibernateTest.java

[java] view plain copy

  1. package cn.edu.imut.test;  
  2. import org.hibernate.Session;  
  3. import org.hibernate.Transaction;  
  4. import cn.edu.imut.beans.Grade;  
  5. import cn.edu.imut.beans.Student;  
  6. import cn.edu.imut.utils.HibernateUtils;  
  7. public class HibernateTest {  
  8. private Transaction tx;  
  9. private Session session;  
  10. /** 
  11. * 初始方法 
  12. */  
  13. public void init(){  
  14. session = HibernateUtils.getSession();  
  15. tx = session.beginTransaction();  
  16. }  
  17. /** 
  18. * 关闭方法 
  19. */  
  20. public void destroy(){  
  21. tx.commit();  
  22. HibernateUtils.closeSession();  
  23. }  
  24. /** 
  25. * 添加关系方法 
  26. */  
  27. public void testMany2OneSave() {  
  28. init();  
  29. Grade grade1 = new Grade("RJ", "2015");  
  30. Grade grade2 = new Grade("JSJ", "2015");  
  31. Student student1 = new Student("朱学良","男","1999");  
  32. Student student2 = new Student("zhuxueliang","男","1999");  
  33. Student student3 = new Student("xueliang","男","1999");  
  34. student1.setGrade(grade1);  
  35. student2.setGrade(grade1);  
  36. student3.setGrade(grade2);  
  37. //做单向时请注释掉  
  38. grade1.getStudent().add(student1);  
  39. grade1.getStudent().add(student2);  
  40. grade2.getStudent().add(student3);  
  41. session.save(student1);  
  42. session.save(student2);  
  43. session.save(student3);  
  44. session.save(grade1);  
  45. session.save(grade2);  
  46. destroy();  
  47. }  
  48. /** 
  49. * 查询方法 
  50. */  
  51. public void testMany2OneQuery() {  
  52. init();  
  53. Student student = (Student) session.get(Student.class, 4);  
  54. /*若查询多的一端的一个对象, 则默认情况下, 只查询了多的一端的对象, 
  55. 而没有查询关联的的那一端的对象!*/  
  56. System.out.println(student.toString());  
  57. System.out.println(student.getGrade().toString());  
  58. destroy();  
  59. }  
  60. /** 
  61. * 修改方法 
  62. */  
  63. public void testMany2OneUpdate() {  
  64. init();  
  65. /*有关联,所以不能直接修改Grade 
  66. Grade grade = (Grade) session.get(Grade.class, 3); 
  67. grade.setGradeName("ShuJu");*/  
  68. Student student = (Student) session.get(Student.class, 5);  
  69. student.getGrade().setGradeName("HeiMa");  
  70. System.out.println(student.getGrade().toString());  
  71. destroy();  
  72. }  
  73. /** 
  74. * 删除方法 
  75. */  
  76. public void testMany2OneDelete() {  
  77. init();  
  78. /*在不设定级联关系的情况下, 且 1 这一端的对象有 n 的对象在引用, 不能直接删除 1 这一端的对象 
  79. Grade grade = (Grade) session.get(Grade.class, 5); 
  80. session.delete(grade); */  
  81. Student student = (Student) session.get(Student.class, 5);  
  82. session.delete(student);  
  83. destroy();  
  84. }  
  85. public static void main(String[] args) {  
  86. new HibernateTest().testMany2OneSave();  
  87. new HibernateTest().testMany2OneQuery();  
  88. new HibernateTest().testMany2OneUpdate();  
  89. new HibernateTest().testMany2OneDelete();  
  90. }  
  91. }  

 

  1. //1. 创建一个 SessionFactory 对象  
  2. SessionFactory sessionFactory = null;  
  3. //1). 创建 Configuration 对象: 对应 hibernate 的基本配置信息和 对象关系映射信息  
  4. Configuration configuration = new Configuration().configure();  
  5. //4.0 之前这样创建  
  6. //      sessionFactory = configuration.buildSessionFactory();  
  7. //2). 创建一个 ServiceRegistry 对象: hibernate 4.x 新添加的对象  
  8. //hibernate 的任何配置和服务都需要在该对象中注册后才能有效.  
  9. ServiceRegistry serviceRegistry =   
  10. new ServiceRegistryBuilder().applySettings(configuration.getProperties())  
  11. .buildServiceRegistry();  
  12. //3).  
  13. sessionFactory = configuration.buildSessionFactory(serviceRegistry);  
  14. //2. 创建一个 Session 对象  
  15. Session session = sessionFactory.openSession();  
  16. //3. 开启事务  
  17. Transaction transaction = session.beginTransaction();  
  18. //4. 执行保存操作  
  19. News news = new News("Java12345", "ATGUIGU", new Date(new java.util.Date().getTime()));  
  20. session.save(news);  
  21. //5. 提交事务   
  22. transaction.commit();  
  23. //6. 关闭 Session  
  24. session.close();  
  25. //7. 关闭 SessionFactory 对象  
  26. sessionFactory.close();  

 

 

5、实验结果

○增加
 

 

 

 

 

 

 

 

○删除
 
 
○修改
 
 
○查询
 
 
○表关系

 

6、实验心得

实验的过程中不是顺利,环境搭建了很长时间。根据报告中的步骤很快实验的代码都完成,但是我还没有深刻理解自己应该多加练习。总之,收获良多。

猜你喜欢

转载自www.cnblogs.com/nqdxt/p/e32e.html
332