内蒙古工业大学
数据科学与应用学院
实 验 报 告
课程名称: 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
- <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <!-- 配置访问Oracle数据库参数信息 -->
- <property name="dialect">
- org.hibernate.dialect.MySQLDialect
- </property>
- <property name="connection.driver_class">
- com.mysql.jdbc.Driver
- </property>
- <property name="connection.url">
- jdbc:mysql://39.105.54.45:3306/test?useUnicod=true&characterEncoding=utf-8
- </property>
- <property name="connection.username">root</property>
- <property name="connection.password">123</property>
- <!-- 在控制台显示SQL语句 -->
- <property name="show_sql">true</property>
- <!-- format_sql:操作数据库时,会先将sql语句格式化 -->
- <property name="format_sql">true</property>
- <!--根据需要自动生成、更新数据表 -->
- <property name="hbm2ddl.auto">update</property>
- <!-- 注册所有ORM映射文件 -->
- <mapping resource="cn/edu/imut/beans/Grade.hbm.xml" />
- <mapping resource="cn/edu/imut/beans/Student.hbm.xml" />
- </session-factory>
- </hibernate-configuration>
②/day_0529_01/src/cn/edu/imut/utils/HibernateUtils.java
[java] view plain copy
- package cn.edu.imut.utils;
- import org.hibernate.HibernateException;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
- import org.hibernate.cfg.Configuration;
- public class HibernateUtils {
- private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
- private static final ThreadLocal<Session> threadLocal
- = new ThreadLocal<Session>();
- private static Configuration configuration = new Configuration();
- private static StandardServiceRegistryBuilder standardServiceRegistryBuilder = new StandardServiceRegistryBuilder();
- private static SessionFactory sessionFactory;
- private static String configFile = CONFIG_FILE_LOCATION;
- /* 静态代码块创建SessionFactory */
- static {
- try {
- configuration.configure(configFile);
- //Hibernate4.3创建SessionFactory的方式
- standardServiceRegistryBuilder.applySettings(configuration.getProperties());
- sessionFactory = configuration.buildSessionFactory(standardServiceRegistryBuilder.build());
- } catch (Exception e) {
- System.err.println("%%%% Error Creating SessionFactory %%%%");
- e.printStackTrace();
- }
- }
- private HibernateUtils() {
- }
- /**
- * 返回ThreadLocal中的session实例
- */
- public static Session getSession() throws HibernateException {
- Session session = (Session) threadLocal.get();
- if (session == null || !session.isOpen()) {
- if (sessionFactory == null) {
- rebuildSessionFactory();
- }
- session = (sessionFactory != null) ? sessionFactory.openSession()
- : null;
- threadLocal.set(session);
- }
- return session;
- }
- /**
- * 返回Hibernate的SessionFactory
- */
- public static void rebuildSessionFactory() {
- try {
- configuration.configure(configFile);
- sessionFactory = configuration.buildSessionFactory(standardServiceRegistryBuilder.build());
- } catch (Exception e) {
- System.err.println("%%%% Error Creating SessionFactory %%%%");
- e.printStackTrace();
- }
- }
- /**
- * 关闭Session实例并且把ThreadLocal中副本清除
- */
- public static void closeSession() throws HibernateException {
- Session session = (Session) threadLocal.get();
- threadLocal.set(null);
- if (session != null) {
- session.close();
- }
- }
- /**
- * 返回SessionFactory
- */
- public static SessionFactory getSessionFactory() {
- return sessionFactory;
- }
- public static void setConfigFile(String configFile) {
- HibernateUtils.configFile = configFile;
- sessionFactory = null;
- }
- public static Configuration getConfiguration() {
- return configuration;
- }
- }
③/day_0529_01/src/cn/edu/imut/beans/Student.hbm.xml
[html] view plain copy
- <?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 package="cn.edu.imut.beans">
- <class name="Student" table="t_student">
- <!-- 学生学号主键 -->
- <id name="studentId" column="student_id">
- <generator class="native" />
- </id>
- <!-- 姓名 -->
- <property name="studentName" column="student_name" />
- <!-- 性别 -->
- <property name="studentSex" column="student_sex" />
- <!-- 出生日期 -->
- <property name="studentBirth" column="student_birth" />
- <!--单向 N-1 -->
- <many-to-one name="grade" class="Grade" column="grade_id"/>
- </class>
- </hibernate-mapping>
④/day_0529_01/src/cn/edu/imut/beans/Student.java
[java] view plain copy
- package cn.edu.imut.beans;
- public class Student {
- private Integer studentId;//学号
- private String studentName;//姓名
- private String studentSex;//性别
- private String studentBirth;//出生日期
- private Grade grade;//班级
- public Student() {
- super();
- // TODO Auto-generated constructor stub
- }
- public Student(String studentName, String studentSex, String studentBirth) {
- super();
- this.studentName = studentName;
- this.studentSex = studentSex;
- this.studentBirth = studentBirth;
- }
- //省略get和set方法
- @Override
- public String toString() {
- return "Student [studentId=" + studentId + ", studentName=" + studentName + ", studentSex=" + studentSex
- + ", studentBirth=" + studentBirth + ", grade=" + grade + "]";
- }
- }
⑤/day_0529_01/src/cn/edu/imut/beans/Grade.hbm.xml
[html] view plain copy
- <?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 package="cn.edu.imut.beans">
- <class name="Grade" table="t_grade">
- <!-- 班级编号主键 -->
- <id name="gradeId" column="grade_id">
- <!-- 主键生成策略为native -->
- <generator class="native" />
- </id>
- <!-- 班级名称 -->
- <property name="gradeName" column="grade_name" type="string"
- not-null="true" />
- <!-- 开班日期 -->
- <property name="gradeBirth" column="grade_birth" type="string"
- not-null="true" />
- <!-- 做单向时请注释掉 -->
- <set name="student" table="t_grade">
- <key column="grade_id" />
- <one-to-many class="Student" />
- </set>
- </class>
- </hibernate-mapping>
⑥/day_0529_01/src/cn/edu/imut/beans/Grade.java
[java] view plain copy
- package cn.edu.imut.beans;
- import java.util.HashSet;
- import java.util.Set;
- public class Grade {
- private Long gradeId;//班级编号
- private String gradeName;//班级名称
- private String gradeBirth;//开班日期
- //做单向时请注释掉
- private Set<Student> student = new HashSet<Student>();
- public Grade() {
- super();
- // TODO Auto-generated constructor stub
- }
- public Grade(String gradeName, String gradeBirth) {
- super();
- this.gradeName = gradeName;
- this.gradeBirth = gradeBirth;
- }
- //省略get和set方法
- @Override
- public String toString() {
- return "Grade [gradeId=" + gradeId + ", gradeName=" + gradeName + ", gradeBirth=" + gradeBirth + "]";
- }
- }
⑦/day_0529_01/src/cn/edu/imut/test/HibernateTest.java
[java] view plain copy
- package cn.edu.imut.test;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import cn.edu.imut.beans.Grade;
- import cn.edu.imut.beans.Student;
- import cn.edu.imut.utils.HibernateUtils;
- public class HibernateTest {
- private Transaction tx;
- private Session session;
- /**
- * 初始方法
- */
- public void init(){
- session = HibernateUtils.getSession();
- tx = session.beginTransaction();
- }
- /**
- * 关闭方法
- */
- public void destroy(){
- tx.commit();
- HibernateUtils.closeSession();
- }
- /**
- * 添加关系方法
- */
- public void testMany2OneSave() {
- init();
- Grade grade1 = new Grade("RJ", "2015");
- Grade grade2 = new Grade("JSJ", "2015");
- Student student1 = new Student("朱学良","男","1999");
- Student student2 = new Student("zhuxueliang","男","1999");
- Student student3 = new Student("xueliang","男","1999");
- student1.setGrade(grade1);
- student2.setGrade(grade1);
- student3.setGrade(grade2);
- //做单向时请注释掉
- grade1.getStudent().add(student1);
- grade1.getStudent().add(student2);
- grade2.getStudent().add(student3);
- session.save(student1);
- session.save(student2);
- session.save(student3);
- session.save(grade1);
- session.save(grade2);
- destroy();
- }
- /**
- * 查询方法
- */
- public void testMany2OneQuery() {
- init();
- Student student = (Student) session.get(Student.class, 4);
- /*若查询多的一端的一个对象, 则默认情况下, 只查询了多的一端的对象,
- 而没有查询关联的的那一端的对象!*/
- System.out.println(student.toString());
- System.out.println(student.getGrade().toString());
- destroy();
- }
- /**
- * 修改方法
- */
- public void testMany2OneUpdate() {
- init();
- /*有关联,所以不能直接修改Grade
- Grade grade = (Grade) session.get(Grade.class, 3);
- grade.setGradeName("ShuJu");*/
- Student student = (Student) session.get(Student.class, 5);
- student.getGrade().setGradeName("HeiMa");
- System.out.println(student.getGrade().toString());
- destroy();
- }
- /**
- * 删除方法
- */
- public void testMany2OneDelete() {
- init();
- /*在不设定级联关系的情况下, 且 1 这一端的对象有 n 的对象在引用, 不能直接删除 1 这一端的对象
- Grade grade = (Grade) session.get(Grade.class, 5);
- session.delete(grade); */
- Student student = (Student) session.get(Student.class, 5);
- session.delete(student);
- destroy();
- }
- public static void main(String[] args) {
- new HibernateTest().testMany2OneSave();
- new HibernateTest().testMany2OneQuery();
- new HibernateTest().testMany2OneUpdate();
- new HibernateTest().testMany2OneDelete();
- }
- }
- //1. 创建一个 SessionFactory 对象
- SessionFactory sessionFactory = null;
- //1). 创建 Configuration 对象: 对应 hibernate 的基本配置信息和 对象关系映射信息
- Configuration configuration = new Configuration().configure();
- //4.0 之前这样创建
- // sessionFactory = configuration.buildSessionFactory();
- //2). 创建一个 ServiceRegistry 对象: hibernate 4.x 新添加的对象
- //hibernate 的任何配置和服务都需要在该对象中注册后才能有效.
- ServiceRegistry serviceRegistry =
- new ServiceRegistryBuilder().applySettings(configuration.getProperties())
- .buildServiceRegistry();
- //3).
- sessionFactory = configuration.buildSessionFactory(serviceRegistry);
- //2. 创建一个 Session 对象
- Session session = sessionFactory.openSession();
- //3. 开启事务
- Transaction transaction = session.beginTransaction();
- //4. 执行保存操作
- News news = new News("Java12345", "ATGUIGU", new Date(new java.util.Date().getTime()));
- session.save(news);
- //5. 提交事务
- transaction.commit();
- //6. 关闭 Session
- session.close();
- //7. 关闭 SessionFactory 对象
- sessionFactory.close();
5、实验结果
○增加
○删除
○修改
○查询
○表关系
6、实验心得
实验的过程中不是顺利,环境搭建了很长时间。根据报告中的步骤,很快实验的代码都完成,但是我还没有深刻理解,自己应该多加练习。总之,收获良多。