一、一对多映射简介

建立一对多关系关系的表的原则是将一的一方的主键加入到多的一方的表作为外键。这里以学生和班级为例子来演示。以前不用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】一对多映射配置的更多相关文章

  1. hibernate进阶--一对多映射配置

    hibernate作为一款优秀的ORM框架,广受大家喜爱,也被Java社区公认为持久层的首选.虽然jdbc为Java数据库操 作带来了诸多便利,但是并没有统一SQL语句的写法,而且具体操作数据库的代码 ...

  2. Hibernatede 一对多映射配置

    Hibernatede 一对多映射配置 以公司和员工为例:公司是一,员工是多   第一步 创建两个实体类,公司和员工        写核心配置文件hibernate.cfg.xml        写映 ...

  3. hibernate之一对多映射

    目录 第一章 课程简介 第二章 Hibernate中的单向一对多关联 2-1 一对多映射简介 2-2 hibernate的基础配置 2-3 创建HibernateUtil工具类 2-4 在mysql数 ...

  4. JAVA spring hibernate 多数据源配置记录

    数据源配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...

  5. hibernate.hbm2ddl.auto配置详解

    hibernate.cfg.xml 中hibernate.hbm2ddl.auto配置节点如下:<properties><property name="hibernate. ...

  6. 攻城狮在路上(壹) Hibernate(十五)--- Hibernate的高级配置

    一.配置数据库连接池: 1.使用默认的数据库连接池: Hibernate提供了默认了数据库连接池,它的实现类为DriverManegerConnectionProvider,如果在Hibernate的 ...

  7. Hibernate入门3.配置映射文件深入

    Hibernate入门3.配置映射文件深入 2013.11.27 前言: 之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题 ...

  8. Mingyang.net:hibernate.hbm2ddl.auto配置详解【转】

    原文地址:http://www.cnblogs.com/feilong3540717/archive/2011/12/19/2293038.html hibernate.cfg.xml 中hibern ...

  9. Hibernate笔记——C3P0配置

    Hibernate作为持久层(ORM)框架,操作数据库,自然也就离不开数据库连接池了.其支持多种连接池,这里就用最熟悉的C3P0连接池. C3P0连接池前面已经介绍了并使用很多次了就不再详细说明了. ...

  10. hibernate的基本配置

    1   Hibernate是一个非侵入式的ORMapping的框架. 2   Hibernate是一个能够将JAVA对象  通过   映射关系    映射到   关系型数据库的  这样一个框架 Hib ...

随机推荐

  1. Accounting_权责发生制和收付实现值的区别(概念)

    2014-07-11 BaoXinjian

  2. NeHe OpenGL教程 第十二课:显示列表

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. 发现木马C:\windows\system32\FastUserSwitchingCompatibilityex.dll

    而且用安全狗还隔离不了

  4. ALITUM DESIGNER 多PIN脚IC元件封装的制作

    多IC芯片的管教众多,一个一个的添加引脚效率较低,网上有好的方法,现总结如下 1 在元件库.schlib中新建元件,画出框图和添加第一个PIN脚 2利用smart paste快速放置众多PIN脚(具体 ...

  5. android webview type=file文件上传,安卓端代码

    http://stackoverflow.com/questions/5907369/file-upload-in-webview http://blog.csdn.net/longlingli/ar ...

  6. Mac添加环境变量的三种方法

    法一: sudo vi /etc/paths 来编辑 paths,将环境变量添加到 paths 中. vim 是一个编辑器,另外还有几个,如:Pico,Emacs. Hint:输入环境变量时,不用一个 ...

  7. springmvc对请求执行流程

    doService-->getHandlerMapping-->handlerMapping-->getHandler-->HandlerExecutionChain--> ...

  8. java io操作常规

    1.四种类型: 字节流: InputStream OutputStream 字符流: Reader Writer 2.转换流 InputStreamReader, OutPutStreamWriter ...

  9. 运行测试Caused by: java.lang.UnsatisfiedLinkError: no attach in java.library.path错误解决

    解决办法:看到错误里面有个Caused by,说我的jdk运行到了32位的了,于是我查看环境变量,发现是昨天设置成32位的没有设置回来,于是设置回64位的jdk就ok了

  10. 单元测试利器之Jtester

    http://kiral.iteye.com/blog/900975 名词解释: Junit:众所周知的单元测试. 官方网址:http://junit.sourceforge.net/.Junit从4 ...