一、一对多映射简介

建立一对多关系关系的表的原则是将一的一方的主键加入到多的一方的表作为外键。这里以学生和班级为例子来演示。以前不用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. 使用 as 和 is 运算符安全地进行强制转换

    由于对象是多态的,因此基类类型的变量可以保存派生类型. 若要访问派生类型的方法,需要将值强制转换回该派生类型. 不过,在这些情况下,如果只尝试进行简单的强制转换,会导致引发 InvalidCastEx ...

  2. 5. redis管道, 发布订阅, 模拟队列

    一. 发布订阅 #订阅scribe 127.0.0.1:6379> SUBSCRIBE "channel_1" Reading messages... (press Ctrl ...

  3. SecureCRT自动记录日志【记录键入的所有命令和打印的结果信息】

  4. java面试常考题

    基础知识: 1.C++或Java中的异常处理机制的简单原理和应用. 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常.违反语义规则包括2种情况.一种是JAVA类库 ...

  5. 8.4c#递归

    一.概念conception: 函数体内调用本函数自身,直到符合某一条件不再继续调用. 二.应满足条件factor: (1)有反复执行的过程(调用自身): (2)有跳出反复执行过程的条件(函数出口) ...

  6. [实变函数]5.4 一般可测函数的 Lebesgue 积分

    1定义 (1)$f$ 在 $E$ 上积分确定 $\lra$ $\dps{\int_Ef^+(x)\rd x<+\infty}$ 或 $\dps{\int_Ef^-(x)\rd x<+\in ...

  7. UCOS-2 消息邮箱与队列

    一个有趣的网络解释: 信号量就是中央政府发给官人做一方大员的官印,有很多种官印但是不能一印多发,得到官印者才能掌权鱼肉一方百姓(任务得到信号量才能运行),否则你就只要等官跑官.(当然官印也可随时被政府 ...

  8. netty入门实例

    TimeServer.java package netty.timeserver.server; import io.netty.bootstrap.ServerBootstrap; import i ...

  9. Xcode5创建自己的静态库详解

    首先声明: 本人屌丝一枚,如有不对不妥之处,请大牛指正! 1.静态库工程的建立: Xcode New一个新的project,选择IOS下面的Framework&Library,下面有一个Coc ...

  10. iOS开发之检查更新

    iOS设备检查更新版本: #pragma mark - 检查更新 - (void)checkUpdateWithAPPID:(NSString *)APPID { //获取当前应用版本号 NSDict ...