1、实验目的
(1) 理解什么是单向、双向、多对一、一对多的含义
(2) 掌握hibernate一对多映射关系
2、实验设备与环境
硬件:安装有Windows XP/7/8系统的微机一台。
软件:JDK1.6以上、MyEclipse 8.0以上,oracle9i以上。
3、实验内容
(1) 使用hibernate配置文件创建学生信息表(学号、姓名、性别、出生日期、班级)、班级信息表(班级编号、班级名称、开班日期)。
(2) 使用hibernate完成两表的主外键关联。
(3) 将配置文件配置成单向多对一,完成对班级和学生信息的增删改查。
(4) 将配置文件配置成双向一对多,完成学生的增删改查。班级的增、删。
4、实验代码
项目预览
用到JAR包
代码
①/day_0529_01/src/hibernate.cfg.xml
<!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
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
<?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
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;
}
public Integer getStudentId() {
return studentId;
}
public void setStudentId(Integer studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getStudentSex() {
return studentSex;
}
public void setStudentSex(String studentSex) {
this.studentSex = studentSex;
}
public String getStudentBirth() {
return studentBirth;
}
public void setStudentBirth(String studentBirth) {
this.studentBirth = studentBirth;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
@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
<?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
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
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();
}
}
package com.atguigu.hibernate.helloworld;
import java.sql.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
public class HibernateTest {
@Test
public void test() {
System.out.println("test...");
//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();
}
}