hibernate笔记--双向一对多映射方法
前两节写了两个例子,分别是单向多对一的映射和单向一对多的映射,这一节继续以这个例子讲一下双向一对多的映射方法,如下图所示:
很多时候,我们既想从一对端获取多对端的信息,又想从多对端获取一对端的数据,这就是需要双向一对多的映射关系,这也是最常见的表与表的映射关系,在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笔记--双向一对多映射方法的更多相关文章
- hibernate笔记--单向一对多映射方法
上一篇讲的是单向多对一的表关系,与单向一对多的关系正好相反,如下图所示关系: ,可以看出年级表和学生表是一对多的关系,一条年级信息对应多条学生信息,在hibernate中成为单向的一对多的映射关系,应 ...
- hibernate笔记--组件映射方法
假设我们需要保存学生student的信息,student中有一个address属性,我们知道像这种信息其值可能会有多个,就像一个人会有两个以上的手机号,这种情况在hibernate中应该这样配置: 新 ...
- 菜鸡的Java笔记 - java 双向一对多映射
双向一对多映射 two-way 开发要求: 根据数据表的结构进行简单java类的转换: 要求实现如下的输出信息: 可以根据课程取得全部参与 ...
- 框架Hibernate笔记系列 基础Session
标题:框架Hibernate笔记 资料地址: 1. www.icoolxue.com 孔浩 1.背景简介 Hibenate是JBoss公司的产品.它是数据持久化的框架.Usually,我们使用JDBC ...
- HIBERNATE一对一双向外键联合主键关联
HIBERNATE一对一双向外键联合主键关联: 一. 创建主键类:这个主键必须实现serializedable接口和重写其中的hashCode方法和equals方法:为主键类添加一个叫做@Embedd ...
- 慕课网Hibernate初探之一对多映射实验及总结
慕课网Hibernate初探之一对多映射实验及总结 一.本课核心 * 1.如何在MyEclipse中使用Hibernate * 2.如何实现Hibernate中一对多的映射 * 3.如何创建Sessi ...
- Java进阶知识07 Hibernate一对一双向外键关联(Annotation+XML实现)
1.Annotation 注解版 1.1.创建Husband类和Wife类 package com.shore.model; import javax.persistence.Entity; impo ...
- hibernate save,update,saveorupdate方法有什么区别
save肯定是添加的时候用,update修改时候用,saveorupdate是添加或修改,如果真是这样save和update的存在就没意义了,我们直接saveorupdate就行了. save在添加用 ...
- Hibernate HQL的update方法详解
虽然hibernate提供了许多方法对数据库进行更新,但是这的确不能满足开发需要.现在讲解一下用hql语句对数据进行更新. 不使用参数绑定格式String hql="update User ...
随机推荐
- php 用 http post方法传输数据
private function http_post($url,$post,$timeout){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL ...
- 关于 iframe 在ie11 height:100% 无效的巨坑
好的,今天公司分配了个解决ie中的bug的任务,其中,有一个就是iframe 的高度 100% 没有生效的问题: 一开始,由于我真的没有怎么去了解过iframe这个货,所以,网上各种搜索一大堆关于这货 ...
- Jquery学习插件之手风琴
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- oracle10g冷备份和恢复过程记录
一.冷备份: 1.操作系统无法进入,需要利用启动盘进入winpe系统进行操作. 2.进入PE系统后,搜索所有盘符确认没有其它被作为oracle数据文件存放的目录,也就是说所有oracle有关的文件都存 ...
- dot
今天写程序的时候发现一个问题啊 在主函数里面吧某个指针node* r=NULL 赋值为空 然后调用函数insert(node* r,....) 在insert里面呢,我给这个指针赋值了啊 但是主函数里 ...
- 从阿里巴巴IPO联想到创始人和资方关系
[小九的学堂,致力于以平凡的语言描述不平凡的技术.如要转载,请注明来源:小九的学堂.cnblogs.com/xfuture] 5月7日,阿里巴巴于今日向美国证券交易委员会(SEC)提交了IPO(首次公 ...
- JSON与XML的区别比较
1.定义介绍 (1).XML定义扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许 ...
- 先有 Mac 还是先有银元?
自从开设了这个公众号以后,收到最多的问题是:听了 Mac 君的介绍,我也觉得 Mac 很好,可是穷屌丝一枚,真买不起,怎么破?前几天我在微博上说,读了我的书,就有 Mac 了.居然有读者来问:这是真的 ...
- 《Hive编程指南》—— 读后总结
知识图谱
- PHP制作查询租房表
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...