1.

示例代码:

Student.java

package cn.itcast.many2many;

import java.util.HashSet;
import java.util.Set; @SuppressWarnings("serial")
public class Student implements java.io.Serializable { private Integer id;
private String name;
private Set<Course> courses=new HashSet(0); public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
}

Course.java

package cn.itcast.many2many;

import java.util.HashSet;
import java.util.Set; @SuppressWarnings("serial")
public class Course implements java.io.Serializable{
private Integer id;
private String name;
private Set<Student> studentes=new HashSet(0); public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStudentes() {
return studentes;
}
public void setStudentes(Set<Student> studentes) {
this.studentes = studentes;
}
}

App.java

package cn.itcast.many2many;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; public class App {
private static SessionFactory sf=null; static{
Configuration config=new Configuration();
config.configure("cn/itcast/many2many/hibernate.cfg.xml");
config.addClass(Student.class);
config.addClass(Course.class);
sf=config.buildSessionFactory();
} /*
* 知识点4:测试保存
*/
@Test
public void saveStudentAndCoure(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); Student s1=new Student();
s1.setName("风侠"); Student s2=new Student();
s2.setName("雨侠"); Course c1=new Course();
c1.setName("语文"); Course c2=new Course();
c2.setName("数学"); //建立关联关系
s1.getCourses().add(c1);
s1.getCourses().add(c2); s2.getCourses().add(c1);
s2.getCourses().add(c2); c1.getStudentes().add(s1);
c1.getStudentes().add(s2); c2.getStudentes().add(s1);
c2.getStudentes().add(s2); session.save(s1);
session.save(s2);
session.save(c1);
session.save(c2); tx.commit();
session.close();
} //知识点5:解除1号学生和1号课程的关联关系
@Test
public void removeMany2Many(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); //查询1号学生
Student s1=(Student)session.get(Student.class, 1); //查询1号课程
Course c1=(Course)session.get(Course.class, 1); //解除关联关系
s1.getCourses().remove(c1);
c1.getStudentes().remove(s1); tx.commit();
session.close();
} //知识点6:改变1号学生和2号课程的关联关系,改为1号学生和1号课程
@Test
public void changeMany2Many(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); //查询1号学生
Student s1=(Student)session.get(Student.class, 1); //查询1号课程
Course c1=(Course)session.get(Course.class, 1); //查询2号课程
Course c2=(Course)session.get(Course.class, 2); //解除1号学生和2号课程关联关系
s1.getCourses().remove(c2);
c2.getStudentes().remove(s1); //建立1号学生和1号课程的关联关系
s1.getCourses().add(c1);
c1.getStudentes().add(s1); tx.commit();
session.close();
} //知识点7:删除2号学生,产生异常
@Test
public void removeStudent(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); //查询2号学生
Student s2=(Student)session.get(Student.class, 2);
session.delete(s2); tx.commit();
session.close();
} /*
* 知识点8:删除1号课程.这里能删除,因为课程是主控方法 student.hbm.xml配置inverse="true"
* * 能删除1号课程
* * 能删除1号课程对应的中间表信息,但不能是删除学生表的信息
*/
@Test
public void removeCourse(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); //查询1号课程
Course c1=(Course)session.get(Course.class, 1);
session.delete(c1); tx.commit();
session.close();
} //知识点9:删除1号课程的同时,要把1号和2号学生删掉? cascade="delete", 中间表用到的学生应先删除
@Test
public void removeCourseCase(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); //查询1号课程
Course c1=(Course)session.get(Course.class, 1);
session.delete(c1); tx.commit();
session.close();
} }

Student.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.many2many.Student" table="student"> <id name="id" type="integer">
<column name="id"/>
<generator class="increment"/>
</id>
<property name="name" type="string">
<column name="name"/>
</property> <!--table为中间表-->
<set name="courses" table="student_course" inverse="true">
<!--coursees这个集合中放置的是课程对象
通过中间表的学生id,查询该学生要学习的课程
select cid from student_course where sid=1
-->
<key column="sid"/>
<!-- class表示coursees集合存放的是什么类型的对象
column="cid":通过课程id获取课程对象
select id,name from course where id=cid;
-->
<many-to-many class="cn.itcast.many2many.Course" column="cid"/>
</set>
</class> </hibernate-mapping>

Course.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.many2many.Course" table="course">
<id name="id" type="integer">
<column name="id"/>
<generator class="increment"/>
</id> <property name="name" type="string">
<column name="name"/>
</property> <!--table为中间表-->
<set name="studentes" table="student_course" cascade="delete">
<!--coursees这个集合中放置的是课程对象
通过中间表的学生id,查询该学生要学习的课程
select cid from student_course where sid=1
-->
<key column="cid"/>
<!-- class表示coursees集合存放的是什么类型的对象
column="cid":通过课程id获取课程对象
select id,name from course where id=cid;
-->
<many-to-many class="cn.itcast.many2many.Student" column="sid"/>
</set>
</class> </hibernate-mapping>

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <!-- 配置数据库的方言,让hibernate知道连接的是哪个数据库-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 配置利用javaBean和映射文件生成数据库中的表
hibernate.hbm2ddl.auto值
* create:执行时,先查找该表是否存在,如存在先删除表,在创建表
* none:不能创建表,只能往表中插入数据,如表不存在抛出异常,默认值
* update:执行时,
情况一:
先查找该表是否存在,如果表存在,直接插入,如果表不存在,先创建表,再插入数据.
情况二:
先查找该表是否存在,如果表存在,但表的结构不一样,要修改表的结构
-->
<property name="hibernate.hbm2ddl.auto">update</property> <!-- 显示hibernate生成的sql语句 -->
<property name="hibernate.show_sql">true</property> <!-- 显示格式化得sql语句 -->
<property name="hibernate.format_sql">false</property> </session-factory>
</hibernate-configuration>

Hibernate -- 映射多对多双向关联关系的更多相关文章

  1. Hibernate映射多对多双向关联关系(小案例)

    多对多双向关联关系(Project(工程)/Emp(员工)为案例): 步骤如下: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 pr ...

  2. Hibernate映射一对多双向关联关系及部门关联属性

    一对多双向关联关系:(Dept/Emp的案例) 既可以根据在查找部门时根据部门去找该部门下的所有员工,又能在检索员工时获取某个员工所属的部门. 步骤如下: 1.构建实体类(部门实体类加set员工集合) ...

  3. Hibernate 映射多对多关联关系

    映射多对多,需要建立一张中间表 一共三张表,一个是 Category,一个是 Item,还有一个是 Categories_Items Categories_Items 作为中间表,其包含两个列,分别对 ...

  4. Hibernate -- 一对多的双向关联关系

    示例代码: Customer.java package cn.itcast.many2onedouble; import java.util.HashSet; import java.util.Set ...

  5. (Hibernate进阶)Hibernate映射——多对多关联映射(八)

    多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...

  6. 【SSH系列】Hibernate映射 -- 多对多关联映射

         映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...

  7. Hibernate 建立一对多双向关联关系

    下面内容整理自<精通Hibernate>第二版 注:既然是双向关联."一对多双向关联"和"多对一双向关联"是同一回事. 对象位于内存中,在内存中从一 ...

  8. 【SSH进阶之路】Hibernate映射——多对多关联映射(八)

    上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...

  9. Hibernate 一对多自身双向关联关系 用于类别表的实现

    分类:一对多自身双向关联关系 Java持久化类: package com.hyy.hibernate.one_to_many.domain; import java.util.HashSet; imp ...

随机推荐

  1. location.assign 与 location.replace的区别

    window.location.assign(url) : 加载 URL 指定的新的 HTML 文档. 就相当于一个链接,跳转到指定的url,当前页面会转为新页面内容,可以点击后退返回上一个页面. w ...

  2. maven 的构建异常 Could not find artifact ... and 'parent.relativePath'

    完整的异常提示: Non-resolvable parent POM: Could not find artifact com.ecp:ecp-main:pom:0.0.1-SNAPSHOT and ...

  3. [Navicat] 常用快捷键及注意事项

    近来需要同时管理多种类型.多台server的数据库,在经历了各种查询客户端(SSMS, SQLyog, PL/SQL等)的不断切换,ip/user/pwd的反复输入的这种自虐式体验后,实在无法忍受,就 ...

  4. 《JAVA多线程编程核心技术》 笔记:第四章、Lock的使用

    一.使用ReentrantLock类1.1 ReentrantLock的使用:1.2 ReentrantLock的不足:1.3 正确使用Condition实现等待/通知1.4 使用多个Conditio ...

  5. Post And Get接口测试

    public class TestPost {   public static String do_post(String url, Map<String, String> params) ...

  6. c# + Sql server 事务处理

    事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便 ...

  7. xshell 没有反应---Xshell按ctrl+s界面无反应的解决办法

    在用Xshell管理远程服务器,特别是在用vi编辑配置文件时,总是习惯的用ctrl+s想要保存文件,然后就悲剧了.xsell就再也没有返应只能关了重新打开.但原来修改的文件算是报废了. 在网上搜索了一 ...

  8. Drupal 8 提供REST服务实例

    drupal8 的核心模块已经支持REST服务. 这样的话使用drupal 对外提供web service 变的简单了. 测试一下d8 的webservice : extend 中的 依赖模块:全部启 ...

  9. Linux学习笔记(13)linux软件安装rpm与yum--理论篇

    该文章linux知识点如下 1.linux中 软件包介绍 2.linux源码软件安装 3.linux二进制软件安装 4.linux rpm软件包管理 5.linux yum软件包管理 1.linux中 ...

  10. Harbor实现容器镜像仓库的管理和运维

    本次分享主要讲述了在开发运维中的管理容器镜像方法.为了便于说明原理,较多地使用Harbor作为例子. 内容主要包括: 开发和生产环境中镜像仓库的权限控制: 镜像远程同步(复制)的原理: 大规模应用镜像 ...