5.多对多关联映射

1.实体多对多关联

两个实体型之间的联系:

多对多联系(m:n)
定义:
如果对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B中的每一个实体,实体集A中也有m个实体(m≥0)与之联系,则称实体集A与实体B具有多对多联系,记为m:n。

2.数据库多对多关联(两个表的关系是必须得拆成三个表的)

Student.java

public class Student {
    private int id;
    private String name;
    private String studentNo;
    private Set<Course> courseSet 
        = new HashSet<Course>();
    ......
} 
Course.java

public class Course {
    private Integer id;
    private String name; // 课程名称
    private int credit;  // 学分
    private Set<Student> studentSet
        = new HashSet<Student>();
    ......
}
Student.hbm.xml

<set name="courseSet" table="STUDENTCOURSE"   
        inverse="false">
    <key column="STUDENTID"/>
    <many-to-many class="Course" column="COURSEID"/>
</set>
Course.hbm.xml

<set name="studentSet" table="STUDENTCOURSE" 
        inverse="true">
    <key column="COURSEID"/>
    <many-to-many class="Student" column="STUDENTID"/>
</set>

<set>元素属性。
name属性:指定类的属性名;
table属性:指定多对多关联关系中间表;
cascade级联操作属性:save-update、delete、all、none。
<set>子元素。
<key>元素:设定实体类对应表的外键;
<many-to-many>元素中class属性:设定关联类型。

inverse 是 Hibernate 中双向关联关系中的基本概念,用来设置关系由哪一方来维护。
inverse=true 表示被控方,=false 表示主控方;
在多对多关系中需要设置哪一方为被控方,即设置inverse=true 。

使用注解映射多对多关系:

在Student类的 courseSet属性上配置,

@ManyToMany
@JoinTable(name="STUDENTCOURSE", 
    joinColumns=@JoinColumn(name="STUDENTID"),
    inverseJoinColumns=@JoinColumn(name="COURSEID"))
在Course类的 studentSet 属性上配置:
@ManyToMany(mappedBy="course")

@ManyToMany:表明多对多关联关系。
@JoinTable
name:指定关联表。
joinColumns:指向实体对应表的外键。
inverseJoinColumns:指向所关联的实体对应表的外键。
@ManyToMany
mappedBy:表示关联关系由Student维护。
原文地址:https://www.cnblogs.com/Firesun/p/9844658.html