多对多,必须有一张关系表来维持关系

数据库student,teacher student_teacher 三张表

但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业
务(比如订单中,除了产品还会记录价格,数量等),但是这时候性质也就变了,成了两个一对多
...好好想想...

  1. //分别Set
  2. public class Student {
  3. private Integer id;
  4. private String name;
  5. private Set<Teacher> teachers;
  6. }
  7.  
  8. public class Teacher {
  9. private Integer id;
  10. private String name;
  11. private Set<Student> students;
  12. }

xxx.hbm.xml配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.kaishengit.pojo">
  6.  
  7. <class name="Teacher" table="teacher">
  8. <id name="id">
  9. <generator class="native"/>
  10. </id>
  11.  
  12. <property name="name"/>
  13. <!-- name="students"属性名,table="student_teacher"关系表名,这里的
  14. order-by表示查询的顺序,指查询关系表中id的倒序-->
  15. <set name="students" table="student_teacher" inverse="true" order-by="id desc" >
  16. <!-- tid表示teacher在关系表中的外键名 -->
  17. <key column="tid"/>
  18. <!-- class="Student"指定Set集合中的类是Student,column="sid"关系表中的外键
  19. order-by表示查询的顺序,指查询Student中id的倒序-->
  20. <many-to-many class="Student" column="sid" order-by="id desc,name asc"/>
  21. </set>
  22.  
  23. </class>
  24.  
  25. </hibernate-mapping>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.kaishengit.pojo">
  6.  
  7. <class name="Student" table="student">
  8. <id name="id">
  9. <generator class="native"/>
  10. </id>
  11.  
  12. <property name="name"/>
  13. <!-- name="teachers"指属性, -->
  14. <set name="teachers" table="student_teacher">
  15. <!-- student在这个关系表中的外键 -->
  16. <key column="sid"/>
  17. <many-to-many class="Teacher" column="tid"/>
  18. </set>
  19.  
  20. </class>
  21.  
  22. </hibernate-mapping>

在hibernate.cfg.xml中添加这两项

程序执行

  1. Teacher t1 = new Teacher();
  2. t1.setTeachername("t1");
  3. Teacher t2 = new Teacher();
  4. t2.setTeachername("t2");
  5.  
  6. Student s1 = new Student();
  7. s1.setStudentname("s1");
  8. Student s2 = new Student();
  9. s2.setStudentname("s2");
  10.  
  11. Set<Teacher> t= new HashSet<Teacher>();
  12. t.add(t1);
  13. t.add(t2);
  14. s1.setTeachers(t);
  15. s2.setTeachers(t);
  16.  
  17. Set<Student> stu = new HashSet<Student>();
  18. stu.add(s1);
  19. stu.add(s2);
  20. t1.setStudents(stu);
  21. t2.setStudents(stu);
  22.  
  23. session.save(s1);
  24. session.save(s2);
  25. session.save(t1);
  26. session.save(t2);

两方都维护关系的时候,关系表中就会插入额外一倍的无用数据
这是错误的,所以多对多必须指明一方放弃维护 inverse="true"

  1. <set name="students" table="student_teacher" inverse="true" >
  2. <key column="tid"/>
  3. <many-to-many class="Student" column="sid" order-by="id desc,name asc"/>
  4. </set>

hibernate 数据关联多对多 4.1的更多相关文章

  1. hibernate 数据关联多对多

    多对多,必须有一张关系表来维持关系 数据库student,teacher student_teacher 三张表 但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业 ...

  2. hibernate 数据关联一对多 3.1

    一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...

  3. hibernate 数据关联一对多

    一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...

  4. hibernate 数据关联一对一 3.2

    第一种一对一 person和card,card的id即作为主键,又作为外键  // 各村对方的一个对象 public class Person { private Integer id; privat ...

  5. hibernate 数据关联一对一

    第一种一对一 person和card,card的id即作为主键,又作为外键  // 各村对方的一个对象 public class Person { private Integer id; privat ...

  6. Hibernate之关联映射(一对多和多对一映射,多对多映射)

    ~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...

  7. Hibernate ManyToOne Mappings 多对一关联映射

    Hibernate ManyToOne Mappings 多对一关联映射 Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml)2.创建持久化类 ...

  8. 初识Hibernate之关联映射(二)

    上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多.本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种: 基于外键的单向一对一关联映射 基于主键的单向一对一关联映射 单 ...

  9. hibernate关联关系(多对多)

    数据库的多对多数据库中不能直接映射多对多 处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多 注:数据库多表联接查询 永远就是二个表的联接查询 注2:交叉连接 注3:外连接:left(左 ...

随机推荐

  1. navicat重新系统丢失libmysql_e

    解决方法: 1把libmysql_e拷贝到c盘的Windows的system文件夹

  2. 《Linux内核设计与实现》内存管理札记

    1.页 芯作为物理页存储器管理的基本单元,MMU(内存管理单元)中的页表,从虚拟内存的角度来看,页就是最小单位. 内核用struct page结构来标识系统中的每个物理页.它的定义例如以下: flag ...

  3. PDFium-PDF开源之旅(1)-初探代码下载编译

    近日,Google和Foxit合作开源了Foxit的PDF源代码. 叫PDFium 相关新闻不少.哈,虽说已经不是程序猿了.只是还是有兴趣跑起来围观看看.废话少说.先说编译代码的步骤(事实上Googl ...

  4. 两种mysql文件安装方式——win7 32位OS

    官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的. 1. .ZIP格式安装 http://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345 ...

  5. iOS 之播放系统声音

    导入框架: 代码: #import <UIKit/UIKit.h> #import <AudioToolbox/AudioToolbox.h> @interface MsgPl ...

  6. freebsd

    #cd /usr/ports/devel/binutils && make install

  7. 常见排序算法C++总结

    看了总结图,我这里就总结一下 直接插入排序,冒泡排序,快速排序,堆排序和归并排序,使用C++实现 重新画了总结图 直接插入排序 整个序列分为有序区和无序区,取第一个元素作为初始有序区,然后第二个开始, ...

  8. QTableView另类打印解决方案(复用render函数去解决print问题)

    Qt QTableView另类打印解决方案     上回书说道Qt的model/view,我就做了个demo用于显示数据库中的内容.没想到tableview的打印竟然成了问题.我困惑了,难道Qt不应该 ...

  9. NHibernate 的 ID 标识选择器

    在 Hibernate 中,每个对象需要一个标识 ID,通过这个标识 ID 建立对象与数据库中记录的对应关系. Nhibernate 提供了多种方式来建立这个 POID.基于不同的生成策略,可以选择更 ...

  10. Runtime.exec使用错误导致延迟.md

    这篇文章是纪录了一个bug解决的过程,可是我还是没有可以真正地找出bug的缘由.希望大牛可以详解. 问题的发现 当接触的系统越来越大的时候,对于系统的性能越来越高的时候,找到表面问题的真正原因就慢慢地 ...