Hibernate的关系映射

1 篇文章 0 订阅
1 篇文章 0 订阅

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();
	}
	
}


5、实验结果

○增加

○删除

○修改

○查询

○表关系


4、源码下载

点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值