多对多关联关系是两张表通过第三张表保存多对多的映射关系,通过下面一个例子来解释:
一个用户可以有多个权限,一个权限可以赋予多个用户,由此形成多对多关系,在 MySQL 中建立多对多关系,如下图:
但是多对多关系的表查询是对三个表进行查询,一定程度上会影响性能效率,尽量少用,或转成多对一,一对多的关系进行关联。
下面就这个例子,使用IDEA,进行如下配置:
(关于具体如何新建项目等,参看此博文:https://blog.youkuaiyun.com/weixin_39663138/article/details/87882776)
之后ok,由 idea 自动生成类文件和*.hbm.xml文件,修改以下几个文件(以下为修改后的内容):
- User.java
package com.wyx.mapping.many_to_many;
import javax.persistence.*;
import java.util.Collection;
import java.util.Objects;
@Entity
public class User {
private int id;
private String name;
private Collection<Role> roles;
@Id
@Column(name = "id", nullable = false)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Basic
@Column(name = "name", nullable = false, length = 45)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id &&
Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
@ManyToMany
public Collection<Role> getRoles(){
return roles;
}
public void setRoles(Collection<Role> roles){
this.roles = roles;
}
}
- User.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>
<class name="com.wyx.mapping.many_to_many.User" table="user" schema="hibernate">
<id name="id">
<column name="id" sql-type="int(10) unsigned"/>
</id