hibernate 数据关联多对多 4.1
多对多,必须有一张关系表来维持关系
数据库student,teacher student_teacher 三张表
但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业
务(比如订单中,除了产品还会记录价格,数量等),但是这时候性质也就变了,成了两个一对多
...好好想想...
- //分别Set
- public class Student {
- private Integer id;
- private String name;
- private Set<Teacher> teachers;
- }
- public class Teacher {
- private Integer id;
- private String name;
- private Set<Student> students;
- }
xxx.hbm.xml配置
- <?xml version="1.0" encoding="UTF-8"?>
- <!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.kaishengit.pojo">
- <class name="Teacher" table="teacher">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <!-- name="students"属性名,table="student_teacher"关系表名,这里的
- order-by表示查询的顺序,指查询关系表中id的倒序-->
- <set name="students" table="student_teacher" inverse="true" order-by="id desc" >
- <!-- tid表示teacher在关系表中的外键名 -->
- <key column="tid"/>
- <!-- class="Student"指定Set集合中的类是Student,column="sid"关系表中的外键
- order-by表示查询的顺序,指查询Student中id的倒序-->
- <many-to-many class="Student" column="sid" order-by="id desc,name asc"/>
- </set>
- </class>
- </hibernate-mapping>
- <?xml version="1.0" encoding="UTF-8"?>
- <!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.kaishengit.pojo">
- <class name="Student" table="student">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <!-- name="teachers"指属性, -->
- <set name="teachers" table="student_teacher">
- <!-- student在这个关系表中的外键 -->
- <key column="sid"/>
- <many-to-many class="Teacher" column="tid"/>
- </set>
- </class>
- </hibernate-mapping>
在hibernate.cfg.xml中添加这两项
程序执行
- Teacher t1 = new Teacher();
- t1.setTeachername("t1");
- Teacher t2 = new Teacher();
- t2.setTeachername("t2");
- Student s1 = new Student();
- s1.setStudentname("s1");
- Student s2 = new Student();
- s2.setStudentname("s2");
- Set<Teacher> t= new HashSet<Teacher>();
- t.add(t1);
- t.add(t2);
- s1.setTeachers(t);
- s2.setTeachers(t);
- Set<Student> stu = new HashSet<Student>();
- stu.add(s1);
- stu.add(s2);
- t1.setStudents(stu);
- t2.setStudents(stu);
- session.save(s1);
- session.save(s2);
- session.save(t1);
- session.save(t2);
两方都维护关系的时候,关系表中就会插入额外一倍的无用数据
这是错误的,所以多对多必须指明一方放弃维护 inverse="true"
- <set name="students" table="student_teacher" inverse="true" >
- <key column="tid"/>
- <many-to-many class="Student" column="sid" order-by="id desc,name asc"/>
- </set>
hibernate 数据关联多对多 4.1的更多相关文章
- hibernate 数据关联多对多
多对多,必须有一张关系表来维持关系 数据库student,teacher student_teacher 三张表 但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业 ...
- hibernate 数据关联一对多 3.1
一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...
- hibernate 数据关联一对多
一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...
- hibernate 数据关联一对一 3.2
第一种一对一 person和card,card的id即作为主键,又作为外键 // 各村对方的一个对象 public class Person { private Integer id; privat ...
- hibernate 数据关联一对一
第一种一对一 person和card,card的id即作为主键,又作为外键 // 各村对方的一个对象 public class Person { private Integer id; privat ...
- Hibernate之关联映射(一对多和多对一映射,多对多映射)
~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...
- Hibernate ManyToOne Mappings 多对一关联映射
Hibernate ManyToOne Mappings 多对一关联映射 Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml)2.创建持久化类 ...
- 初识Hibernate之关联映射(二)
上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多.本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种: 基于外键的单向一对一关联映射 基于主键的单向一对一关联映射 单 ...
- hibernate关联关系(多对多)
数据库的多对多数据库中不能直接映射多对多 处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多 注:数据库多表联接查询 永远就是二个表的联接查询 注2:交叉连接 注3:外连接:left(左 ...
随机推荐
- navicat重新系统丢失libmysql_e
解决方法: 1把libmysql_e拷贝到c盘的Windows的system文件夹
- 《Linux内核设计与实现》内存管理札记
1.页 芯作为物理页存储器管理的基本单元,MMU(内存管理单元)中的页表,从虚拟内存的角度来看,页就是最小单位. 内核用struct page结构来标识系统中的每个物理页.它的定义例如以下: flag ...
- PDFium-PDF开源之旅(1)-初探代码下载编译
近日,Google和Foxit合作开源了Foxit的PDF源代码. 叫PDFium 相关新闻不少.哈,虽说已经不是程序猿了.只是还是有兴趣跑起来围观看看.废话少说.先说编译代码的步骤(事实上Googl ...
- 两种mysql文件安装方式——win7 32位OS
官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的. 1. .ZIP格式安装 http://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345 ...
- iOS 之播放系统声音
导入框架: 代码: #import <UIKit/UIKit.h> #import <AudioToolbox/AudioToolbox.h> @interface MsgPl ...
- freebsd
#cd /usr/ports/devel/binutils && make install
- 常见排序算法C++总结
看了总结图,我这里就总结一下 直接插入排序,冒泡排序,快速排序,堆排序和归并排序,使用C++实现 重新画了总结图 直接插入排序 整个序列分为有序区和无序区,取第一个元素作为初始有序区,然后第二个开始, ...
- QTableView另类打印解决方案(复用render函数去解决print问题)
Qt QTableView另类打印解决方案 上回书说道Qt的model/view,我就做了个demo用于显示数据库中的内容.没想到tableview的打印竟然成了问题.我困惑了,难道Qt不应该 ...
- NHibernate 的 ID 标识选择器
在 Hibernate 中,每个对象需要一个标识 ID,通过这个标识 ID 建立对象与数据库中记录的对应关系. Nhibernate 提供了多种方式来建立这个 POID.基于不同的生成策略,可以选择更 ...
- Runtime.exec使用错误导致延迟.md
这篇文章是纪录了一个bug解决的过程,可是我还是没有可以真正地找出bug的缘由.希望大牛可以详解. 问题的发现 当接触的系统越来越大的时候,对于系统的性能越来越高的时候,找到表面问题的真正原因就慢慢地 ...