hibernate 数据关联多对多
多对多,必须有一张关系表来维持关系
数据库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 数据关联多对多的更多相关文章
- hibernate 数据关联多对多 4.1
多对多,必须有一张关系表来维持关系 数据库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(左 ...
随机推荐
- centos 时区正确,时间不对
centos6.5 里面 时区是 Asia/Shanghai ,但是 时间还是不对,在网上收集了如下做法:好像恢复了~~ (主要过程是: 查看各种设置,然后设置时间,最后更新本机时间,最后保持与时间 ...
- LeetCode:最长回文子串【5】
LeetCode:最长回文子串[5] 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: ...
- LeetCode:移动零【283】
LeetCode:移动零[283] 题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3 ...
- LeetCode:字符串的排列【567】
LeetCode:字符串的排列[567] 题目描述 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: ...
- session不能使用 ASP.NET MVC
在web.coonfig中添加 <sessionState mode=" /> 如: <system.web> //... <sessionState mode ...
- 【LeetCode】数组排列问题(permutations)(附加next_permutation解析)
描述 Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3 ...
- mini2440移植uboot 2014.04(二)
我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <u-boot-2011 ...
- Delphi 的类型与指针
Delphi 的指针分为 "类型指针" 和 "无类型指针" 两类.Delphi 中的类型, 常用的也得有几百个, 我们可以给每种类型定义相应的类型指针.其实 D ...
- mac活动监视器闪退
输入:rm -rf ~/Library/LaunchAgents/com.apple.Yahoo.plist即可!
- 算法(Algorithms)第4版 练习 1.5.22
package com.qiusongde; import edu.princeton.cs.algs4.StdOut; import edu.princeton.cs.algs4.StdStats; ...