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(左 ...
随机推荐
- bd存储
var sessionData = new Array();var setSessionData=function(key,val){ if(sessionStorage){ sessionStora ...
- Kattis - flippingcards 【并查集】
题意 给出 N 对 数字 然后 每次从一对中 取出一个数字 判断 能否有一种取出的方案 取出的每个数字 都是不同的 思路 将每一对数字 连上一条边 然后 最后 判断每一个连通块里面 边的个数 是否 大 ...
- linux mint console-setup
sudo dpkg-reconfigure console-setup after setup, setupcon
- 每天一个Linux命令(36)ps命令
Linux中的ps命令是Process Status的缩写. ps命令用于报告当前系统的进程状态.可以搭配kill指令随时中断.删除不必要的程序. (1)用法: ...
- 【leetcode刷题笔记】Maximal Rectangle
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...
- java-从这里开始认识
<java是什么:>Programming language 程序语言Development environment 开发环境Application environment 应用环境Dep ...
- 开发rsync启动脚本
rsync rsync是类unix系统下的数据镜像备份工具——remote sync.一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH.rsync主机同步. ...
- jquery实现td控制显示宽度
目的为了实现td表格元素出现省略的情况,然后点击中间位置是td的宽度增加. 实现代码如下,采用css+jquery的实现方式: <!DOCTYPE html> <html lang= ...
- ajax实现聊天室功能
需求如下: 先死后活. 需求分析,分析思路如图所示: 1.创建数据库 create database chat; create table messages( id int unsigned prim ...
- SQL-INSERT INTO用法
一.单独向表或视图中插入一行数据: insert [into]table_name[(column1,column2,...)]values (value1,value2,...) 说明: 1.int ...