【Hibernate 4】一对多映射配置
一、一对多映射简介
建立一对多关系关系的表的原则是将一的一方的主键加入到多的一方的表作为外键。这里以学生和班级为例子来演示。以前不用hibernate时建立pojo类要在学生类Student中加入一个属性,即班级编号classesid.使用hibernate则不同了,需要在“一”的一方类中加入一个set集合,里面存放“多”的一方的对象。而在“多”的一方的类中需要加入一个“一”方的对象。也就是说在Classes类中需要加入一个set集合,存放Student对象,因为一个班级里面对应多个学生,所以用一个集合来表示。而每一个学生只能属于一个班级,所以学生类Student里面需要加入一个Classes类对象,表示所属班级。
这里主要介绍的是一对多的关联映射,多对一和一对多很接近,就不作阐述!
二、实例介绍
2.1,建立实体类和映射
Student类:
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.angel.hibernate;
import java.util.Date;
public class Student {
private int id;
private String name;
private Date createTime;
public Student() {
}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
</span>
映射文件:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.angel.hibernate.Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="createTime"/>
</class>
</hibernate-mapping></span>
Classes类:
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.angel.hibernate;
import java.util.Set;
public class Classes {
private int id;
private String name;
private Set<Student> students;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
</span>
映射文件:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.angel.hibernate.Classes" table="t_classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- 配置级联操作和维护双方关系的职责 -->
<set name="students" inverse="true" cascade="all">
<key column="classesid"/>
<one-to-many class="com.angel.hibernate.Student"/>
</set>
</class>
</hibernate-mapping></span>
2.2,测试类
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.angel.hibernate; import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set; import org.hibernate.Session; import junit.framework.TestCase; public class test_one2many extends TestCase { public void testSave1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Student student1 = new Student();
student1.setName("you");
student1.setCreateTime(new Date());
//将student1的状态从瞬时状态变为持久状态
session.save(student1); Student student2 = new Student();
student2.setName("me");
student2.setCreateTime(new Date());
//将student2的状态从瞬时状态变为持久状态
session.save(student2); Classes classes = new Classes();
classes.setName("friend"); Set<Student> students = new HashSet<Student>();
students.add(student1);
students.add(student2);
classes.setStudents(students); //如果前面没有转换student的状态,这里会抛出异常TransientObjectException
session.save(classes);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateUtils.closeSession(session);
}
} public void testLoad1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Classes classes = (Classes) session.load(Classes.class, 5);
System.out.println("classes.name=" + classes.getName());
Set<Student> students = classes.getStudents();
for (Iterator<Student> iter = students.iterator(); iter.hasNext();) {
Student student = (Student) iter.next();
System.out.println("student.name=" + student.getName());
}
//级联删除
//session.delete(classes);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
}
</span>
三、特殊属性说明
3.1,lazy属性
lazy – 延迟加载(懒加载),一般用于集合的抓取策略,也就是说只在需要用到的情况下,再发出select语句,将其相关的对象查询出来。set默认lazy属性的值是true,即hibernate会自动使用懒加载策略,以提高性能。举例说明:
<span style="font-family:KaiTi_GB2312;font-size:18px;"> <set name="students“ lazy=“false”>
<key column="classesid" ></key>
<one-to-many class="com.angel.hibernate.Student" />
</set></span>
3.2,inverse属性
inverse – 标记由哪一方来维护关联关系(双向关联中会用到),inverse默认值为false,如果inverse设置为true,表示将由对方维护两者之间的关联关系。举例说明:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><!-- 配置级联操作和维护双方关系的职责 -->
<set name="students" inverse="true" cascade="all">
<key column="classesid"/>
<one-to-many class="com.angel.hibernate.Student"/>
</set></span>
3.3,cascade属性
级联的意思是指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作。总共可以取值为:all、none、save-update、delete:all-代表在所有的情况下都执行级联操作;none-在所有情况下都不执行级联操作;save-update-在保存和更新的时候执行级联操作;delete-在删除的时候执行级联操作
四、总结
今天的感觉就是,之前没有对底层进行封装的时候,所有的关系都体现在数据表的设计上,比如说,为了维护这种一对多的关系,我们在设计表单的时候就会在多的一方加入一的一方的主键作为外键。那么现在呢,则是将这种实体之间的联系配置到了配置文件中。但实际上,在执行的时候,还是和之前的SQL语句差不多。所以,运用一个框架,封装了之后,自然有其优势,但是它的灵活性还是会有所降低!
多对多映射和一对多映射在配置上,基本是一致的。Hibernate会自动生成中间表,采用many-to-many标签来表示其多对多的关联,同样采用集合来表示。下篇博客介绍继承映射和多态查询。
【Hibernate 4】一对多映射配置的更多相关文章
- hibernate进阶--一对多映射配置
hibernate作为一款优秀的ORM框架,广受大家喜爱,也被Java社区公认为持久层的首选.虽然jdbc为Java数据库操 作带来了诸多便利,但是并没有统一SQL语句的写法,而且具体操作数据库的代码 ...
- Hibernatede 一对多映射配置
Hibernatede 一对多映射配置 以公司和员工为例:公司是一,员工是多 第一步 创建两个实体类,公司和员工 写核心配置文件hibernate.cfg.xml 写映 ...
- hibernate之一对多映射
目录 第一章 课程简介 第二章 Hibernate中的单向一对多关联 2-1 一对多映射简介 2-2 hibernate的基础配置 2-3 创建HibernateUtil工具类 2-4 在mysql数 ...
- JAVA spring hibernate 多数据源配置记录
数据源配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...
- hibernate.hbm2ddl.auto配置详解
hibernate.cfg.xml 中hibernate.hbm2ddl.auto配置节点如下:<properties><property name="hibernate. ...
- 攻城狮在路上(壹) Hibernate(十五)--- Hibernate的高级配置
一.配置数据库连接池: 1.使用默认的数据库连接池: Hibernate提供了默认了数据库连接池,它的实现类为DriverManegerConnectionProvider,如果在Hibernate的 ...
- Hibernate入门3.配置映射文件深入
Hibernate入门3.配置映射文件深入 2013.11.27 前言: 之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题 ...
- Mingyang.net:hibernate.hbm2ddl.auto配置详解【转】
原文地址:http://www.cnblogs.com/feilong3540717/archive/2011/12/19/2293038.html hibernate.cfg.xml 中hibern ...
- Hibernate笔记——C3P0配置
Hibernate作为持久层(ORM)框架,操作数据库,自然也就离不开数据库连接池了.其支持多种连接池,这里就用最熟悉的C3P0连接池. C3P0连接池前面已经介绍了并使用很多次了就不再详细说明了. ...
- hibernate的基本配置
1 Hibernate是一个非侵入式的ORMapping的框架. 2 Hibernate是一个能够将JAVA对象 通过 映射关系 映射到 关系型数据库的 这样一个框架 Hib ...
随机推荐
- Cygwin之SSH服务安装过程问题
1.折磨了最长时间的一个问题 $ ssh localhostssh: connect to host localhost port 22: Connection refused 各种google,百度 ...
- 黄聪:Dsicuz x2.5、X3、X3.2如何去掉域名后面的/forum.php
Dsicuz x2.5去掉域名后面的/forum.php 1, 后台--全局--域名设置--应用域名--设置默认域名为访问域名就可以,如:www.xxxxx.com 上面2种方法都可以去掉域名后面的/ ...
- [Java Web – Maven – 1A]maven 3.3.3 for windows 配置(转)
1.环境 系统环境:windows 2008 R2 JDK VERSION: 1.7.0_10 2.下载地址 MAVEN 下载地址:http://maven.apache.org/download.c ...
- communication ports in DOS systems:
: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7,COM8, COM9, LPT1, LPT2, LPT3, LPT4, L ...
- Git-Flow
Overview Git-Flow is a high-level command set wrapping low-level Git commands to support the "s ...
- Sprite的原点
对于某些类型的游戏,例如飞行射击游戏或者顶视角的2D游戏,通常会直接选取图片的中心做为原点.但对于<冰杖秘闻>这样的 2D ARPG 来说,会更多的从三维场景的角度来选择原点,即选择物品底 ...
- Oracle Erp常用网站
2014-01-01 Created By BaoXinjian
- mrp功能分类
mrp主要有六大功能子系统:[工程管理子系统].[销售管理子系统].[计划管理子系统].[采购管理子系统].[库存管理子系统].[MRP运行管理子系统].[工程管理子系统]主要功能:产品/物料编码表. ...
- 回调--一个经典例子让你彻彻底底理解java回调机制
本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢 以前不理解什么叫回调 ...
- map遍历测试结果
结论:一般情况下推荐使用enterSet的for循环(即以下的方法2),如果只是取key值可以使用keySet性能会更好. 因为keySet只取key,enterSet即取了key又取了value. ...