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

数据库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 数据关联多对多的更多相关文章

  1. hibernate 数据关联多对多 4.1

    多对多,必须有一张关系表来维持关系 数据库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. Symfony 使用KnpTimeBundle

    使用time_diff时出现:diff.ago.hour; 解决:1:引入"knplabs/knp-time-bundle": "^1.7",https://g ...

  2. Xen虚拟化基础篇

    一.xen的简介 Xen是一个开放源代码虚拟机监视器,由剑桥大学开发.它打算在单个计算机上运行多达128个有完全功能的操作系统. 在旧(无虚拟硬件)的处理器上执行Xen,操作系统必须进行显式地修改(& ...

  3. value too great for base (error token is "08")

    shell 中,经常有定时任务, 这时候shell脚本中一般会对时间进行一些判断,或者相关逻辑的操作 这时候,如果你获取的小时或者分钟是08,09,如果要再对其进行运算符或者比较的话,就会报标题的错误 ...

  4. DevOps means no Ops!

    DevOps means no Ops! 只单纯地搞网络的话或许你可以搞得非常好,并且获得不错的薪资,不过,5年后~10年后~,那时候随便一个人经过简单的学习就能通过Web界面或者专用的工具就能搞定一 ...

  5. PHP常用正则验证

    手机号,身份证,ip验证 //正则验证手机号 正确返回 true function preg_mobile($mobile) { if(preg_match("/^1[34578]\d{9} ...

  6. css3图片过滤效果

    在线演示 本地下载

  7. Mac OS下新建文本文档

    ---恢复内容开始--- 介绍 不知道小伙伴们有没有发现这样一件事情:Mac下没有新建文本文档!如果你恰好经常需要新建类似于.cpp,.in,.out等文件的话,每次终端用一堆$ cd命令再加上一句$ ...

  8. Linux LVM管理

    创建和管理LVM 要创建一个LVM系统,一般需要经过以下步骤: 1. 创建分区 fdisk /dev/sdb 使用分区工具(如:fdisk等)创建LVM分区,方法和创建其他一般分区的方式是一样的,区别 ...

  9. WebSocket实现Web聊天室

    一.客户端: JS代码如下: /* * 这部分js将websocket封装起来 */ var websocket = null; //判断当前浏览器是否支持WebSocket if ('WebSock ...

  10. Hadoop集群初始化启动

    hadoop集群初始化启动 启动zookeeper ./zkServer.sh start 启动journalnode ./hadoop-daemon.sh start journalnode 格式化 ...