1、创建实体和映射

package com.alice.hibernate03.vo;

import java.util.HashSet;
import java.util.Set; public class Student {
private Integer id;
private String sname;
private Set<Course> courses = new HashSet<Course>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
}
package com.alice.hibernate03.vo;

import java.util.HashSet;
import java.util.Set; public class Course {
private Integer id;
private String cname;
private Set<Student> students = new HashSet<Student>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}

2、映射

<?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.alice.hibernate03.vo">
<class name="Student" table="t_student">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="sname" column="sname" type="string"></property>
<!-- 多对多关系 -->
<!--
set 表达集合
name: 集合的属性名
table:多对多中间表的表名
key 表达外键
column:引用我的外键名
many-to-many 表达多对多
class : 集合引用方的类型
column:对方在中间表的外键名
-->
<set name="courses" table="t_student_course" inverse="false" cascade="save-update">
<!--
key 用来描述外键
column : 外键的值
-->
<key column="sid"></key>
<many-to-many class="Course" column="cid"></many-to-many>
</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.alice.hibernate03.vo">
<class name="Course" table="t_course">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="cname" column="cname" type="string"></property>
<!-- 多对多关系 -->
<!--
set 表达集合
name: 集合的属性名
table:多对多中间表的表名
key 表达外键
column:引用我的外键名
many-to-many 表达多对多
class : 集合引用方的类型
column:对方在中间表的外键名
-->
<set name="students" table="t_student_course" inverse="true" cascade="save-update">
<key column="cid"></key>
<many-to-many class="Student" column="sid"></many-to-many>
</set>
</class>
</hibernate-mapping>

  3、测试

package com.alice.hibernate03.many;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import com.alice.hibernate03.util.HibernateUtil;
import com.alice.hibernate03.vo.Course;
import com.alice.hibernate03.vo.Student; public class ManyTest {
@Test
public void test01(){
//保存学生 => 通过学生保存课程. 由学生维护外键
//Student 的
//inverse = false
//cascade = save-update
//Course
//inverse = true
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction();
//...........................
Student s1 = new Student();
s1.setSname("angle"); Student s2 = new Student();
s2.setSname("echo"); Course c1 = new Course();
c1.setCname("jdbc"); Course c2 = new Course();
c2.setCname("spring"); Course c3 = new Course();
c3.setCname("strust2"); s1.getCourses().add(c1);
s1.getCourses().add(c2); s2.getCourses().add(c2);
s2.getCourses().add(c3); session.save(s1);
session.save(s2);
//...........................
tran.commit();
session.close();
}
}

hibernate学习(5)——多对多关系映射的更多相关文章

  1. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. hibernate学习(设计一对一 关系 映射)

    //主表 package org.crazy.app.domain; import javax.persistence.*; @Entity @Table(name="person_inf& ...

  3. 菜鸟学习Hibernate——多对多关系映射

    Hibernate中的关系映射,最常见的关系映射之一就是多对多关系映射例如用户与角色的关系,一个用户对应多个角色,一个角色对应多个用户.如图: Hibernate中如何来映射这两个的关系呢? 下面就为 ...

  4. Hibernate学习笔记(五) — 多对多关系映射

    多对多关系映射 多对多建立关系相当于在第三张表中插入一行数据 多对多解除关系相当于在第三张表中删除一行数据 多对多改动关系相当于在第三张表中先删除后添加 多对多谁维护效率都一样.看需求 在实际开发过程 ...

  5. 【Java EE 学习 46】【Hibernate学习第三天】【多对多关系映射】

    一.多对多关系概述 以学生和课程之间的关系为例. 1.在多对多关系中涉及到的表有三张,两张实体表,一张专门用于维护关系的表. 2.多对多关系中两个实体类中应当分别添加对方的Set集合的属性,并提供se ...

  6. Hibernate多对多关系映射(建表)

    下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...

  7. Hibernate自身一对多和多对多关系映射

    一对多关系映射大家都明白,关系双方都一个含有对方多个引用,但自身一对多很多同学都不明白什么意思,那么首先我就说明一下什么是自身一对多,其实也很好理解,自身一对多就是自身含有本身的多个引用,例如新闻类别 ...

  8. Hibernate(三)——框架中的关系映射

    在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系.而Hibernate时间实体类和数据库中的表进行的映射, ...

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

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

随机推荐

  1. redis 快速入门(win7)

    0:介绍 百度百科or官网 1:下载  选择32位或者64 地址:https://github.com/dmajkic/redis/downloads 1.1下载后如图 1.2文件介绍 redis-s ...

  2. MAGENTO - APACHE SOLR INTEGRATION - PART II (SETUP)

    MAGENTO - APACHE SOLR INTEGRATION - PART II (SETUP) Tue, 03/01/2011 - 18:30 Tweet Development E-Comm ...

  3. Memcache之内存分配机制

    可参见:http://blog.csdn.net/hguisu/article/details/7353482

  4. AngularJS Select(选择框)

    AngularJS 可以使用数组或对象创建一个下拉列表选项. 使用 ng-option 创建选择框 在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和 ...

  5. 关于readonly修饰符

    修饰字段: 1.值类型:不能修改值 2.引用类型:是指该字段引用的对象不可以修改,但是里面的内容是可以修改的! 示例: static void Main(string[] args) { Consol ...

  6. Android -- Activity,Fragment lifecycle

    Activity Lifecyce Fragment Lifecycle: 程序运行: 09-16 13:59:22.883 19022-19022/com.example.android.archi ...

  7. MyBatis学习(三)

    输入和输出映射 resultType 指定输出结果的类型(pojo.简单类型.hashmap等),将sql查询结果映射为java对象 . 注意:sql查询的列名要和resultType指定pojo的属 ...

  8. rhel5.8安装oracle 10g ASM

    1.所有的配置和文件系统一样 2.规划: 加了8块小盘,ASM为了实验使用asmlib驱动(rhel6不再支持asmlib驱动),裸设备的2种方法(rowdevice和udev) 三块盘使用asmli ...

  9. layer弹出层 layer源码

    下载源码:点击下载 ;!function(window, undefined){ "use strict"; var pathType = true, //是否采用自动获取绝对路径 ...

  10. python 里面的单下划线与双下划线的区别

    python 里面的单下划线与双下划线的区别 Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __ ...