一、一对多映射简介

建立一对多关系关系的表的原则是将一的一方的主键加入到多的一方的表作为外键。这里以学生和班级为例子来演示。以前不用hibernate时建立pojo类要在学生类Student中加入一个属性,即班级编号classesid.使用hibernate则不同了,需要在“一”的一方类中加入一个set集合,里面存放“多”的一方的对象。而在“多”的一方的类中需要加入一个“一”方的对象。也就是说在Classes类中需要加入一个set集合,存放Student对象,因为一个班级里面对应多个学生,所以用一个集合来表示。而每一个学生只能属于一个班级,所以学生类Student里面需要加入一个Classes类对象,表示所属班级。

这里主要介绍的是一对多的关联映射,多对一和一对多很接近,就不作阐述!

二、实例介绍

2.1,建立实体类和映射

Student类:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">package com.angel.hibernate;
  2.  
  3. import java.util.Date;
  4.  
  5. public class Student {
  6.  
  7. private int id;
  8.  
  9. private String name;
  10.  
  11. private Date createTime;
  12.  
  13. public Student() {
  14. }
  15.  
  16. public Student(int id, String name) {
  17. this.id = id;
  18. this.name = name;
  19. }
  20.  
  21. public int getId() {
  22. return id;
  23. }
  24.  
  25. public void setId(int id) {
  26. this.id = id;
  27. }
  28.  
  29. public String getName() {
  30. return name;
  31. }
  32.  
  33. public void setName(String name) {
  34. this.name = name;
  35. }
  36.  
  37. public Date getCreateTime() {
  38. return createTime;
  39. }
  40.  
  41. public void setCreateTime(Date createTime) {
  42. this.createTime = createTime;
  43. }
  44. }
  45. </span>

映射文件:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.angel.hibernate.Student" table="t_student">
  7. <id name="id">
  8. <generator class="native"/>
  9. </id>
  10. <property name="name"/>
  11. <property name="createTime"/>
  12. </class>
  13. </hibernate-mapping></span>

Classes类:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">package com.angel.hibernate;
  2.  
  3. import java.util.Set;
  4.  
  5. public class Classes {
  6.  
  7. private int id;
  8.  
  9. private String name;
  10.  
  11. private Set<Student> students;
  12.  
  13. public int getId() {
  14. return id;
  15. }
  16.  
  17. public void setId(int id) {
  18. this.id = id;
  19. }
  20.  
  21. public String getName() {
  22. return name;
  23. }
  24.  
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28.  
  29. public Set<Student> getStudents() {
  30. return students;
  31. }
  32.  
  33. public void setStudents(Set<Student> students) {
  34. this.students = students;
  35. }
  36. }
  37. </span>

映射文件:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.angel.hibernate.Classes" table="t_classes">
  7. <id name="id">
  8. <generator class="native"/>
  9. </id>
  10. <property name="name"/>
  11. <!-- 配置级联操作和维护双方关系的职责 -->
  12. <set name="students" inverse="true" cascade="all">
  13. <key column="classesid"/>
  14. <one-to-many class="com.angel.hibernate.Student"/>
  15. </set>
  16. </class>
  17. </hibernate-mapping></span>

2.2,测试类

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">package com.angel.hibernate;
  2.  
  3. import java.util.Date;
  4. import java.util.HashSet;
  5. import java.util.Iterator;
  6. import java.util.Set;
  7.  
  8. import org.hibernate.Session;
  9.  
  10. import junit.framework.TestCase;
  11.  
  12. public class test_one2many extends TestCase {
  13.  
  14. public void testSave1() {
  15. Session session = null;
  16. try {
  17. session = HibernateUtils.getSession();
  18. session.beginTransaction();
  19. Student student1 = new Student();
  20. student1.setName("you");
  21. student1.setCreateTime(new Date());
  22. //将student1的状态从瞬时状态变为持久状态
  23. session.save(student1);
  24.  
  25. Student student2 = new Student();
  26. student2.setName("me");
  27. student2.setCreateTime(new Date());
  28. //将student2的状态从瞬时状态变为持久状态
  29. session.save(student2);
  30.  
  31. Classes classes = new Classes();
  32. classes.setName("friend");
  33.  
  34. Set<Student> students = new HashSet<Student>();
  35. students.add(student1);
  36. students.add(student2);
  37. classes.setStudents(students);
  38.  
  39. //如果前面没有转换student的状态,这里会抛出异常TransientObjectException
  40. session.save(classes);
  41. session.getTransaction().commit();
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. session.getTransaction().rollback();
  45. } finally {
  46. HibernateUtils.closeSession(session);
  47. }
  48. }
  49.  
  50. public void testLoad1() {
  51. Session session = null;
  52. try {
  53. session = HibernateUtils.getSession();
  54. session.beginTransaction();
  55. Classes classes = (Classes) session.load(Classes.class, 5);
  56. System.out.println("classes.name=" + classes.getName());
  57. Set<Student> students = classes.getStudents();
  58. for (Iterator<Student> iter = students.iterator(); iter.hasNext();) {
  59. Student student = (Student) iter.next();
  60. System.out.println("student.name=" + student.getName());
  61. }
  62. //级联删除
  63. //session.delete(classes);
  64. session.getTransaction().commit();
  65. } catch (Exception e) {
  66. e.printStackTrace();
  67. session.getTransaction().rollback();
  68. } finally {
  69. HibernateUtils.closeSession(session);
  70. }
  71. }
  72. }
  73. </span>

三、特殊属性说明

3.1,lazy属性

lazy – 延迟加载(懒加载),一般用于集合的抓取策略,也就是说只在需要用到的情况下,再发出select语句,将其相关的对象查询出来。set默认lazy属性的值是true,即hibernate会自动使用懒加载策略,以提高性能。举例说明:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"> <set name="students“ lazy=“false”>
  2. <key column="classesid" ></key>
  3. <one-to-many class="com.angel.hibernate.Student" />
  4. </set></span>

3.2,inverse属性

inverse – 标记由哪一方来维护关联关系(双向关联中会用到),inverse默认值为false,如果inverse设置为true,表示将由对方维护两者之间的关联关系。举例说明:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><!-- 配置级联操作和维护双方关系的职责 -->
  2. <set name="students" inverse="true" cascade="all">
  3. <key column="classesid"/>
  4. <one-to-many class="com.angel.hibernate.Student"/>
  5. </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. 配置文件——WebApp.config文件读取和修改

    using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using ...

  2. [CSS]图片与文字对齐问题

    摘自:张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com] 图片与文字默认是居底对齐了.所以当图片与文字在一起的时候往往都是不对齐的.尤其图片较小时就更加明显了,我看到很多人使 ...

  3. ADF_ADF Faces系列4_ADF数据可视化组件简介之建立BarChart/Gauge/ExportExcel

    2013-05-01 Created By BaoXinjian

  4. PLSQL_性能优化系列18_Oracle Explain Plan解析计划通过Baseline绑定

    2015-05-28 Created By BaoXinjian

  5. Codeforces Round #364 (Div. 2) Cards

    Cards 题意: 给你n个牌,n是偶数,要你把这些牌分给n/2个人,并且让每个人的牌加起来相等. 题解: 这题我做的时候,最先想到的是模拟,之后码了一会,发现有些麻烦,就想别的方法.之后发现只要把它 ...

  6. 网页地图map

    <map name="map"> <area shape="rect" coords="75,75,99,99" nohr ...

  7. Eclipse Tomcat配置/管理/调试指南

    从myeclipse转到Eclipse最不方便的之一莫过于Web项目部署了,老是在想怎么不能把myeclipse的那个移植过来,或者有没有高人能按照Myeclipse开发一个,非常遗憾. 原版的Ecl ...

  8. IntelliJ IDEA 注册码

    IntelliJ IDEA 注册码 *.lanyus.com及*.qinxi1992.cn下的全部授权服务器已遭JetBrains封杀 请搭建自己的IntelliJ IDEA授权服务器,教程在http ...

  9. [Java] 对象排序示例

    package test.collections; import java.util.ArrayList; import java.util.Collection; import java.util. ...

  10. [ActionScript 3.0] AS3 绘制正八面体(线条)

    分析: 将八面体置于3D坐标系中,其中心的坐标位于原点(0,0,0),让八面体的六个顶点恰好位于3D坐标系的x轴.y轴和z轴上,则从八面体的中心到这六个顶点的距离是相等的.我们可以假设这个距离为r,则 ...