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

数据库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>

最新文章

  1. jq实现点击表格无刷新修改数据,优化版
  2. MySQL无视密码进入Server
  3. inline(内联函数)
  4. [BZOJ 1692] [Usaco2007 Dec] 队列变换 【后缀数组 + 贪心】
  5. 关于Grunt可视化的尝试
  6. C++ 构造函数或析构函数调用虚函数
  7. iOS开发常用第三方开源框架 持续更新中...
  8. C语言使用vs2013进行编辑
  9. Vue-CLI和脚手架
  10. Linux笔记-nohup和&amp;
  11. python练习:实现一个整数数组里面两个数之和为183的所有整数对
  12. windows环境下安装rabbitmq及配置可视化管理界面
  13. HTML5 加密和摘要算法(base64,md5, sha1,rsa)
  14. ODAC(V9.5.15) 学习笔记(三)TOraSession(1)
  15. Confluence 6 配置边栏链接
  16. jacob将word转换为html
  17. 网络基础 Windows下安装和配置net-snmp&#160;代理
  18. AutoMapper6扩展
  19. C# 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。
  20. 16 - 文件操作-StringIO-BytesIO

热门文章

  1. Python3.2官方文档翻译--作用域和命名空间
  2. JQuery DataTable插件
  3. HDU2546:饭卡(01背包)
  4. 【转】Linq实现DataTable行列转换
  5. AC自动机妙用
  6. 什么是weblogic?安装步骤详解
  7. rhApp遇到的项目问题
  8. 一个帝国cms [!--show.listpage--] css样式
  9. ie的selectNodes函数和firefox的document.evaluate
  10. 射频识别技术漫谈(26)——Felica的文件系统