Hibernate之多对多

一、项目结构如下图

二、代码如下(测试类中不能再有双向关联,否则会报错,因为,都维护了中间表外键,会有中间表外键冲突,如果非要写双向关联,就需要配置中设置某一方维护主键,课程和学生映射配置文件中相应配置inverse为true和false)

package com.hjp.manytomany;

import java.util.HashSet;
import java.util.Set;

/**
 * Created by JiaPeng on 2016/1/2.
 */
public class Course {
    private int id;
    private String name;

    public Set<Student> getStudentSet() {
        return studentSet;
    }

    public void setStudentSet(Set<Student> studentSet) {
        this.studentSet = studentSet;
    }

    private Set<Student> studentSet = new HashSet<Student>();

    @Override
    public String toString() {
        return "Course{" +
                "id=" + id +
                ", name=‘" + name + ‘\‘‘ +
                ‘}‘;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Course

<?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>
  <class name="com.hjp.manytomany.Course" table="course">
      <id name="id">
          <generator class="native"></generator>
      </id>
      <property name="name" length="20"></property>
      <set name="studentSet" table="s_c">
          <key column="c_id"></key>
          <many-to-many class="com.hjp.manytomany.Student" column="s_id"></many-to-many>
      </set>
  </class>
</hibernate-mapping>

course.hbm.xml

package com.hjp.manytomany;

import java.util.HashSet;
import java.util.Set;

/**
 * Created by JiaPeng on 2016/1/2.
 */
public class Student {
    private int id;
    private String name;
    private Set<Course> courseSet = new HashSet<Course>();

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name=‘" + name + ‘\‘‘ +
                ", courseSet=" + courseSet +
                ‘}‘;
    }

    public Set<Course> getCourseSet() {
        return courseSet;
    }

    public void setCourseSet(Set<Course> courseSet) {
        this.courseSet = courseSet;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Student

<?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>
   <class name="com.hjp.manytomany.Student" table="student">
       <id name="id">
           <generator class="native"></generator>
       </id>
       <property name="name" length="20"></property>
       <set name="courseSet" table="s_c">
           <key column="s_id"></key>
           <many-to-many class="com.hjp.manytomany.Course" column="c_id"></many-to-many>
       </set>
   </class>
</hibernate-mapping>

student.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/h1</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">hjp123</property>
        <!--设置c3p0-->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <!--c3p0连接池配置信息-->
        <property name="c3p0.min_size">5</property>
        <property name="c3p0.max_size">20</property>
        <property name="c3p0.timeout">120</property>
        <property name="c3p0.idle_test_period">3000</property>
        <!--显示SQL并格式化-->
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <!--ddl生成策略,后面可以改为update-->
        <property name="hibernate.hbm2ddl.auto">create</property>
        <!--导入映射文件-->
        <mapping resource="com/hjp/manytomany/course.hbm.xml"></mapping>
        <mapping resource="com/hjp/manytomany/student.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

hibernate.cfg.xml

 public void func3() {
        Session session = HibernateUtils.getSession();
        session.beginTransaction();
//创建两个学生
        Student student1 = new Student();
        student1.setName("张三");

        Student student2 = new Student();
        student2.setName("李四");
        //创建三门课程
        Course course1 = new Course();
        course1.setName("Java");

        Course course2 = new Course();
        course2.setName(".Net");

        Course course3 = new Course();
        course3.setName("php");

        //学生关联课程
        //张三java\php
        student1.getCourseSet().add(course1);
        student1.getCourseSet().add(course3);
        //李四php\.Net
        student2.getCourseSet().add(course2);
        student2.getCourseSet().add(course3);

        //课程关联学生
//        course1.getStudentSet().add(student1);
//        course2.getStudentSet().add(student2);
//        course3.getStudentSet().add(student1);
//        course3.getStudentSet().add(student2);

        session.save(student1);
        session.save(student2);
        session.save(course1);
        session.save(course2);
        session.save(course3);
        session.getTransaction().commit();
        session.close();
    }

测试类中测试方法

时间: 2024-10-26 13:49:56

Hibernate之多对多的相关文章

Hibernate单向多对多

最近做一个OA系统,用到了Hibernate框架,我发现,权限和角色的关系是一种多对多的关系,一个权限可以分配给多个角色,一个角色拥有多个权限. 多对多关系有两种,一种是单向的,一种是多向的.对于这个问题,曾经让我很犯难.单纯在语言上理解,会比较复杂,而从代码上理解,可能就会明白了. 下面模拟为角色授权的过程: 1,Hibernate使用Annotation 2,使用Junit进行测试. 3,使用Mysql作为后台数据库. 4,Hibernate不使用自动建表,也不采用反向工程. 过程 : 1,

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

     映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张表中做一个关联,用第三张表来解决可能造成的数据冗余问题.今天这篇博文小编来简单的介绍一下hibernate中的多对多关联映射. 在某些系统中,一个用户可以有多个角色,一个角色也可以有多个用户,so,她们之间的关系就是多对多,多对多关联

Hibernate之多对多篇

Hibernate值多对多篇: 首先Hibernate基于数据库持久层框架,好的OR框架.封装了JDBC对数据库繁琐的操作,完全以面向对象的方式来操作数据库,提供了以及一级,二级缓存. 下面就来谈谈Hibernate的优点与缺点: 优点: 1.对jdbc访问数据库进行了封装,简化了繁琐的操作. 2.映射的灵活性 3.非侵入性,移植性好.(就是说只需将你的映射文件及其配置文件移植到相应另一台计算机上照样可以运行,因为表的它是自己检查创建的,这一点非常好,不像Mybatis那 你要去建一个和他的映射

总结Hibernate的多对多关联的4个特点

总结Hibernate的多对多关联的4个特点: 以学生和课程多对多的例子说明,实体类部分代码: public class Course { private Integer cid; private String cname; private Set<Student> stuSet; //getter setter...... } public class Student { private Integer id; private String name; private Date birthd

Hibernate单向多对一级联删除引发的问题

Hibernate单向多对一在级联删除时,会出现一些问题. 下面模拟我遇到的问题: 这次模拟与之前的一次模拟方法一直,博客:http://blog.csdn.net/openjdk8/article/details/38424403 模拟场景:有一个部门表t_dept,职位表t_position. 需求:当删除部门表时,不管职位表有没数据,照样删除.删除职位表就直接删除. 1,建表: 建表: t_dept::部门表 t_position:职位表 CREATE TABLE t_dept(    d

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

多对多双向关联关系(Project(工程)/Emp(员工)为案例): 步骤如下: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 private Integer pid; //名称 private String pname; //定义集合类型的Emp属性 private Set<Emp> emps=new HashSet<Emp>(); public Integer getPid() { return pid; }

Hibernate annotation多对多配置

角色(用户组),用户多对多. 角色实体配置: private Set<TAuthUser> users; @ManyToMany @JoinTable(name="t_auth_user_role",joinColumns={@JoinColumn(name="role_id")},inverseJoinColumns={@JoinColumn(name="user_id")})//配置一方 public Set<TAuthUs

hibernate中多对多关联

hibernate中多对多关联 “计应134(实验班) 凌豪” 在关系数据库中有一种常见的关系即多对多关系,例如课程和学生的关系,一个学生可以选择多门课程,同时一门课程也可以被多个学生选择, 因此课程与学生的关系就可以看成是多对多的关系,其中课程表的结构如下图所示: 学生表user 在关系数据库中不能直接建立多对多关联,要想建立这种多对多的关系只能借助第三张中间表, 因此为了建立这种多对多的关系我们需要建立第三张表User_course 为了实现表的多对多关联,需要在两个表的Hibernate配

Hibernate的多对多映射关系

example: 老师(teacher)和学生(Student)就是一个多对多的关系吧?老师可以有多个学生,学生也可以由多个老师,那在Hibernate中多对多是怎样实现的呢?? 在Hibernate中多对多关系分为两种:1单向的多对多,2双向的多对多 下面详细说明一些两种有什么不同和实现步骤 I单向的多对多实现步骤: 1新建teacher.student表,可以任意选择在其中一个表添加另一个表的集合,(例如在teacher中添加student的set<Student>集合,例如private

HIBERNATE 实现多对一

一个Product对应一个Category 一个Category对应多个Product 所以Product和Category是多对一的关系 本例讲解如何使用Hibernate实现多对一关系 第一步 准备Category.java 1 package com.ghw.pojo; 2 3 public class Category { 4 5 public int getId() { 6 return id; 7 } 8 public void setId(int id) { 9 this.id =