前两节写了两个例子,分别是单向多对一的映射和单向一对多的映射,这一节继续以这个例子讲一下双向一对多的映射方法,如下图所示:

  很多时候,我们既想从一对端获取多对端的信息,又想从多对端获取一对端的数据,这就是需要双向一对多的映射关系,这也是最常见的表与表的映射关系,在hibernate中应当这样配置:

新建Studnet实体类:

public class Student {

    private int id;
private String name;
private String sex;
private Grade grade;
//get/set方法省略
}

新建Grade实体类:

public class Grade {

    private int id;
private String name;
private String teacher;
private Set<Student> students=new HashSet<Student>(0);
//get/set方法省略
}

当前包下新建Student的映射文件Student.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wang.pojo">
<class name="Student" >
<id name="id">
<generator class="native"></generator>
</id> <property name="name"></property>
<property name="sex"></property>
<many-to-one name="grade" class="Grade" column="gradeId" not-null="true"></many-to-one>
</class>
</hibernate-mapping>

当前包下新建Grade的映射文件Grade.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wang.pojo">
<class name="Grade" >
<id name="id">
<generator class="native"></generator>
</id> <property name="name"></property>
<property name="teacher"></property>
<!-- set是一种集合属性,可以配置set,list等,这里是Grade的集合属性 name是属性名称 -->
<set name="students">
<!-- key表示外键 column表示外键列名 注意在双向一对多的关系中,一对端即这里的Grade不需要设置notnull="true"-->
<key column="gradeId" ></key>
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>

将两个映射文件添加到hibernate.cfg.xml中去,新建测试类,测试1:自动生成表结构2:存取数据3:读取数据(分别测试从Student一端读取,以及从grade一段读取):

@Test
public void testCreateDB() {
Configuration cfg = new Configuration().configure();
SchemaExport se = new SchemaExport(cfg);
// 第一个参数是否生成ddl脚本 第二个参数是否执行到数据库
se.create(true, true);
} @Test
public void testSave() {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
// Score s=new Score(2,12,97);
// session.save(s);
Grade g=new Grade(1, "终极一班", "王大炮"); Student s1=new Student(12, "李云龙", "男", g);
Student s2=new Student(13, "赵刚", "男", g); session.save(g);
session.save(s1);
session.save(s2);
tx.commit();
session.close();
}
@Test
public void testGet() {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//从Grade一端获取数据
Grade g=(Grade)session.get(Grade.class, 1);
System.out.println("id="+g.getId()+"name="+g.getName()+"teacher="+g.getTeacher());
Iterator<Student> it = g.getStudents().iterator();
while(it.hasNext()){
Student s=it.next();
System.out.println(s);
}
//从Student一端获取数据
Student s1=(Student)session.get(Student.class, 1);
System.out.println(s1.getName()+"====="+s1.getGrade().getName());
tx.commit();
session.close();
}

  总结:在双向一对多的映射关系中,注意一的一端(Grade)配置:<key>标签中不需要指定not-null="true";如果想要在一的一端(Grade)来维护关系,那么在多的一端(Student)不用指定关联列非空.

hibernate笔记--双向一对多映射方法的更多相关文章

  1. hibernate笔记--单向一对多映射方法

    上一篇讲的是单向多对一的表关系,与单向一对多的关系正好相反,如下图所示关系: ,可以看出年级表和学生表是一对多的关系,一条年级信息对应多条学生信息,在hibernate中成为单向的一对多的映射关系,应 ...

  2. hibernate笔记--组件映射方法

    假设我们需要保存学生student的信息,student中有一个address属性,我们知道像这种信息其值可能会有多个,就像一个人会有两个以上的手机号,这种情况在hibernate中应该这样配置: 新 ...

  3. 菜鸡的Java笔记 - java 双向一对多映射

    双向一对多映射    two-way    开发要求:        根据数据表的结构进行简单java类的转换:        要求实现如下的输出信息:            可以根据课程取得全部参与 ...

  4. 框架Hibernate笔记系列 基础Session

    标题:框架Hibernate笔记 资料地址: 1. www.icoolxue.com 孔浩 1.背景简介 Hibenate是JBoss公司的产品.它是数据持久化的框架.Usually,我们使用JDBC ...

  5. HIBERNATE一对一双向外键联合主键关联

    HIBERNATE一对一双向外键联合主键关联: 一. 创建主键类:这个主键必须实现serializedable接口和重写其中的hashCode方法和equals方法:为主键类添加一个叫做@Embedd ...

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

    慕课网Hibernate初探之一对多映射实验及总结 一.本课核心 * 1.如何在MyEclipse中使用Hibernate * 2.如何实现Hibernate中一对多的映射 * 3.如何创建Sessi ...

  7. Java进阶知识07 Hibernate一对一双向外键关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.创建Husband类和Wife类 package com.shore.model; import javax.persistence.Entity; impo ...

  8. hibernate save,update,saveorupdate方法有什么区别

    save肯定是添加的时候用,update修改时候用,saveorupdate是添加或修改,如果真是这样save和update的存在就没意义了,我们直接saveorupdate就行了. save在添加用 ...

  9. Hibernate HQL的update方法详解

    虽然hibernate提供了许多方法对数据库进行更新,但是这的确不能满足开发需要.现在讲解一下用hql语句对数据进行更新. 不使用参数绑定格式String hql="update User ...

随机推荐

  1. DoTween 教程

    官方网站:http://dotween.demigiant.com/ 下载地址:http://dotween.demigiant.com/download.php pro版下载地址:http://pa ...

  2. 各种android应用模仿源码

    V2EX的非官方Android客户端,极力遵循Material Design风格 下载 湘潭大学三翼校园"四季电台" Android客户端   下载   高仿煎蛋客户端    下载 ...

  3. PHP基础知识之类

    类中的方法访问方式: class A{    function foo()    {            }} 1.A::foo(); 2.$a = new A(); $a->foo(); 3 ...

  4. The Solution of UESTC 2016 Summer Training #1 Div.2 Problem A

    Link http://acm.hust.edu.cn/vjudge/contest/121539#problem/A Description standard input/output Haneen ...

  5. AndroidStudio错误总结及解决(待续)

    AndroidStudio错误总结及解决 一. 当安装好AndroidStudio开启的时候出现如下错误: 百度的解决方法: 1)进入刚安装的Android Studio目录下的bin目录.找到ide ...

  6. 用Fmx调用Bass.dll

    先上图 帮亲戚做个小软件,选用FMX,因为画面不会像vcl那样在图片多的时候闪烁.还能添加动画 但是MediaPlayer播放音乐视频真是不给力,视频没想到好办法.音频方面想到之前万一的Bass.ll ...

  7. [Window Title] (没有登录) [Content] ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务 [OK]

    重启Oracle服务

  8. ASP.Net WebForm温故知新学习笔记:二、ViewState与UpdatePanel探秘

    开篇:经历了上一篇<aspx与服务器控件探秘>后,我们了解了aspx和服务器控件背后的故事.这篇我们开始走进WebForm状态保持的一大法宝—ViewState,对其刨根究底一下.然后,再 ...

  9. ASP.Net MVC开发基础学习笔记:二、HtmlHelper与扩展方法

    一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归. ...

  10. lua中清空目录和递归创建目录

    lua中的 lfs.mkdir lfs.rmdir只能针对单个目录,且lfs.rmdir不能清空文件夹 于是我想到了使用os.execute 递归创建目录如下os.execute("mkdi ...