欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring data jpa 的多对多映射关系

程序员文章站 2022-04-24 11:34:00
...

spring data jpa 的多对多映射关系

描述:用户和角色的关系
用包含关系来说明
一个用户可以拥有多个角色,同时一个角色可以被多个用户所具有
先了解一些注解再来配置
注意:我这里配置时候没有用lombok的注解防止出错
典型的多对多的关系
@ManyToMany
作用:用于映射多对多关系
属性:
cascade:配置级联操作。
fetch:配置是否采用延迟加载。
targetEntity:配置目标的实体类。映射多对多的时候不用写。
@JoinTable
作用:针对中间表的配置
属性:
nam:配置中间表的名称
joinColumns:中间表的外键字段关联当前实体类所对应表的主键字段
inverseJoinColumn:中间表的外键字段关联对方表的主键字段
@JoinColumn
作用:用于定义主键字段和外键字段的对应关系。
属性:
name:指定外键字段的名称
referencedColumnName:指定引用主表的主键字段名称
unique:是否唯一。默认值不唯一
nullable:是否允许为空。默认值允许。
insertable:是否允许插入。默认值允许。
updatable:是否允许更新。默认值允许。
columnDefinition:列的定义信息。

斜体的一般都不用
## 下面正式开始配置:

/**
 * @author leebob
 *用户实体类
 *
 */
@Entity
@Table(name="sys_user")
public class SysUser {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="user_id")
	private Long userId;
	@Column(name="user_code")
	private String userCode;
	@Column(name="user_name")
	private String userName;
	@Column(name="user_password")
	private String userPassword;
	@Column(name="user_state")
	private String userState;
	//多对多关系映射
	@ManyToMany(targetEntity = SysRole.class)
	@JoinTable(name="sys_user_role",//中间表的名称
	//JoinColumns当前对象在中间表的外键
	  joinColumns={@JoinColumn(name="sys_user_id",referencedColumnName="user_id")},
	  //inverseJoinColumns对方对象在中间表的外键
	  inverseJoinColumns={@JoinColumn(name="sys_role_id",referencedColumnName="role_id")}
)
	private Set<SysRole> roles ;
	省略了属性getter和setter方法
	public Set<SysRole> getRoles() {
		return roles;
	}
	public void setRoles(Set<SysRole> roles) {
		this.roles = roles;
	}
	@Override
	public String toString() {
		return "SysUser [userId=" + userId + ", userCode=" + userCode + ", userName=" + userName + ", userPassword="
		+ userPassword + ", userState=" + userState + "]";
	}
}
/**
 * @author leebob
 *角色实体类
 */
@Entity
@Table(name="sys_role")
public class SysRole {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="role_id")
	private Long roleId;
	@Column(name="role_name")
	private String roleName;
	@Column(name="role_memo")
	private String roleMemo;
	
	//多对多关系映射
	@ManyToMany(targetEntity = SysUser.class)
	@JoinTable(name="sys_user_role",//中间表的名称
	//当前对象在中间表的外键
 joinColumns={@JoinColumn(name="sys_role_id",referencedColumnName="role_id")},
inverseJoinColumns={@JoinColumn(name="sys_user_id",referencedColumnName="user_id")}
	)
	private Set<SysUser> userss ;
	
	public Set<SysUser> getUserss() {
		return userss;
	}
	public void setUserss(Set<SysUser> userss) {
		this.userss = userss;
	}
	@Override
	public String toString() {
		return "SysRole [roleId=" + roleId + ", roleName=" + roleName + ", roleMemo=" + roleMemo + "]";
	}
}

上面的配置其实有些繁琐,不过也可以生成三张表
spring data jpa 的多对多映射关系

其实可以很简单,也就是先要明确主表和从表
我们先让一方放弃维护外键的权利,让谁放弃呢,看需求了
通常是被动的一方放弃维护权,在配置关系属性中使用mappedBy = “” ,值指的是对方配置多对多关系的属性名称
这里让角色放弃维护外键的权利,这样写mappedBy = “roles”
只需要修改

/**
 * @author leebob
 *用户实体类
 *
 */
@Entity
@Table(name="sys_user")
public class SysUser {
	//多对多关系映射
	@ManyToMany
	private Set<SysRole> roles ;
	}
/**
 * @author leebob
 *角色实体类
 *
 */
@Entity
@Table(name="sys_role")
public class SysRole {
	//多对多关系映射
	@ManyToMany(mappedBy = "roles")
	private Set<SysUser> users ;

至于为什么
JPA中使用@ManyToMany来注解多对多的关系,由一个关联表来维护。这个关联表的表名默认是:主表名+下划线+从表名。(主表是指关系维护端对应的表,从表指关系被维护端对应的表)。这个关联表只有两个外键字段,分别指向主表ID和从表ID。字段的名称默认为:主表对应的属性名称+下划线+主表中的主键列名,从表对应的属性名称+下划线+从表中的主键列名。
我的实验结果为:
spring data jpa 的多对多映射关系
默认生成的三张表,其中一张关系表
参考:
添加链接描述