【Hibernate】(4)Hibernate一对多映射

1. 一对多关联

(1). 创建工程与数据库

打开MyEclipse,创建工程导入所需要的jar包,配置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>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123465</property>
		<property name="hibernate.connection.url">
        	<![CDATA[
        		jdbc:mysql://localhost:3306/one2many:useUnicode=true&characterEncoding=utf8
        	]]>
		</property>
		<property name="show_sql">true</property>
		<property name="hbm2ddl.auto">update</property>
	</session-factory>
</hibernate-configuration>

创建MySQL中数据库one2many。

(2). 创建工具类:

public class HibernateUtil {
	private static SessionFactory sessionFactory;
	private static Session session;

	static {
		// 创建configuration对象,读取hibernate.cfg.xml配置
		Configuration config = new Configuration().configure();
		StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
				.applySettings(config.getProperties());
		StandardServiceRegistry registry = builder.build();
		sessionFactory = config.buildSessionFactory(registry);
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public static Session getSession() {
		session = sessionFactory.openSession();
		return session;
	}

	public static void closeSession(Session session) {
		if (session != null) {
			session.close();
		}
	}
}

(3). 创建表

create table grade(
gid int primary key,
gname varchar(20) not null,
gdesc varchar(50)
);
create table student(
sid int primary key,
sname varchar(20) not null,
sex char(2),
gid int
);
alter table student add constraint fk_student_gid foreign key (gid) references grade(gid);

(4). 创建Student和Grade类以及他们的关联映射文件

<hibernate-mapping>

	<class name="com.thr.entity.Student" table="student">
		<id name="sid" column="sid" type="java.lang.Integer">
			<generator class="increment"></generator>
		</id>
		<property name="sname" type="java.lang.String">
			<column name="sname" length="20" not-null="true"></column>
		</property>
		<property name="sex">
			<column name="sex"></column>
		</property>
	</class>
</hibernate-mapping>
<hibernate-mapping>
	<class name="com.thr.entity.Grade" table="grade">
		<id name="gid" column="gid" type="java.lang.Integer">
			<generator class="increment"></generator>
		</id>
		<property name="gname" type="java.lang.String">
			<column name="gname" length="20" not-null="true"></column>
		</property>
		<property name="gdesc">
			<column name="gdesc"></column>
		</property>
		<!-- 配置单向一对多的关联关系 -->
		<set name="students" table="student">
			<!-- 指定关联的外键列 -->
			<key column="gid"></key>
			<one-to-many class="com.thr.entity.Student" />
		</set>
	</class>
</hibernate-mapping>

然后在hibernate.cfg.xml配置文件中添加这两个文件的路径:

		<!-- 指定关联映射文件的路径 -->
		<mapping resource="com/thr/entity/Grade.hbm.xml"/>
		<mapping resource="com/thr/entity/Student.hbm.xml"/>

(5). 编写测试类

测试添加和查询:

	/**
	 * 学生添加到班级
	 */
	@Test
	public void add() {
		Grade g = new Grade("三年二班", "哎呦不错哦");
		Student s1 = new Student("张三", "男");
		Student s2 = new Student("李四", "女");
		g.getStudents().add(s1);
		g.getStudents().add(s2);

		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		session.save(g);
		session.save(s1);
		session.save(s2);
		transaction.commit();
		HibernateUtil.closeSession(session);
	}

	/**
	 * 查询班级中包含的学生
	 */
	@Test
	public void findStudentByGrade() {
		Session session = HibernateUtil.getSession();
		Grade g = (Grade) session.get(Grade.class, 1);
		System.out.println(g.toString());
		Set<Student> students = g.getStudents();
		for (Student s : students) {
			System.out.println(s);
		}
	}

修改和删除测试:

	/**
	 * 修改学生信息
	 */
	@Test
	public void update() {
		Grade g = new Grade("三年三班", "还行吧");
		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Student s = (Student) session.get(Student.class, 1);
		g.getStudents().add(s);
		session.save(g);
		transaction.commit();
		HibernateUtil.closeSession(session);
	}

	/**
	 * 删除学生信息
	 */
	@Test
	public void delete() {
		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Student s = (Student) session.get(Student.class, 1);
		session.delete(s);
		transaction.commit();
		HibernateUtil.closeSession(session);
	}

(6). set元素的常用属性

2. 多对一关联

给原来的Student类添加一个Grade成员,设置set和get方法,修改Student.hbm.xml配置,添加:

		<!-- 配置多对一关联配置 -->
		<many-to-one name="grade" class="com.thr.entity.Grade"
			column="gid">
		</many-to-one>

编写测试类:

	@Test
	public void save() {
		Grade g = new Grade("四年三班", "四年三班");
		Student s1 = new Student("Jerry", "男");
		Student s2 = new Student("kate", "女");
		// 设置关联关系
		s1.setGrade(g);
		s2.setGrade(g);

		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		session.save(g);
		session.save(s1);
		session.save(s2);
		transaction.commit();
		HibernateUtil.closeSession(session);
	}

3. inverse和cascade属性

(1). inverse属性

<set>节点的inverse属性指定关联关系的控制方向,默认由one方来维护。

关联关系中,inverse="false"则为主动方,由主动方负责维护关联关系。

在一对多关联中,只能设置one方的inverse为true,这将有助于性能的改善。

(2). cascade属性

当设置了cascade属性不为none时,Hibernate会自动持久化所关联的对象

cascade属性的设置会带来性能上的变动,需谨慎设置

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 17:56:14

【Hibernate】(4)Hibernate一对多映射的相关文章

慕课网Hibernate初探之一对多映射实验及总结

慕课网Hibernate初探之一对多映射实验及总结 一.本课核心 * 1.如何在MyEclipse中使用Hibernate * 2.如何实现Hibernate中一对多的映射 * 3.如何创建Session对象 * 4.Hibernate如何使用增删改查 1.如何在MyEclipse中使用Hibernate * Hibernat框架创建 * MyEclipse2016 CI 7版本 * Hibernate release-5.2.10.Final * 方法一:自动创建 * 1.新建一个Java项目

Hibernate配置文件——hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <

Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略

Hibernate 加载数据 有get,跟Load 1.懒加载: 使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Test    public void  test1()    {        Session session = null;         try {             session = Hiber

Rhythmk 学习 Hibernate 02 - Hibernate 之 瞬时状态 离线状态 持久化状态 三状态

by:rhythmk.cnblogs.com 1.Hibernate 三种状态: 1.1.三种定义(个人理解,不一定准确):  瞬时状态(transient):    不被session接管,且不存在数据库中的对象的状态,类似于新New一个对象  离线状态 (detached):    数据库中存在而不被session接管  持久化状态(persistent): 对象被session管理且数据库中存在此对象 1.2. 状态之间转换关系图 2 .状态转换以及Hibernate数据库执行过程详解:

异常:org.hibernate.HibernateException: &#39;hibernate.dialect&#39; must be set when no Connection available

spring整合hibernate报了这样一个异常,一直以为是dialect参数的问题,最后发现原来是配数据源时,数据库的名字写错了....... 找了半天,重新写了配置文件没出问题,但就不知道这个文件哪里出问题了.配置文件里面这种细节一定要注意. 版权声明:本文为博主原创文章,未经博主允许不得转载. 异常:org.hibernate.HibernateException: 'hibernate.dialect' must be set when no Connection available

Rhythmk 学习 Hibernate 04 - Hibernate 辅助工具 之 JBoos Tool

1.安装JBoos Tool Help -> Install new Software 然后添加: http://download.jboss.org/jbosstools/updates/development http://download.jboss.org/jbosstools/updates/stable/ 稍等一刻,选择 Hibernate tool 下一步 ,完成后重启Eclipse即可. 2.项目配置文件生成: 2.1 新建一项目,项目右键生成相关配置 然后如图: 2.2 此处需

Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [ManyToOne,OneToMany]

1.项目结构: 1.1.场景说明: 一个订单,包含多个产品 1.2.类文件: Order.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 package com.rhythmk.model; import java.util.Date; public

Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [One To One]

1.One To One 单相 背景: 古代一个老婆  只能关联一个老公 husband.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.rhythmk.model; public class husband {          public Integer getHusbandId() {         return husbandId;     }     public void setHusba

Hibernate之Hibernate环境配置

Hibernate之Hibernate环境配置 一.Hibernate环境搭建的步骤 1.添加Hibernate && SQLServer 的Jar antlr-2.7.7.jar dom4j-1.6.1.jar hibernate-commons-annotations-4.0.5.Final.jar hibernate-core-4.3.11.Final.jar hibernate-jpa-2.1-api-1.0.0.Final.jar jandex-1.1.0.Final.jar j

Rhythmk 学习 Hibernate 09 - Hibernate HQL

1.初始数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 @Test     public void test01() {         Session session = null;         try {             session = HibernateUtil.getSessionFactory().openSession();             session.begin