Spring-data-jpa多对多双向关联时出现死循环,内存溢出

原代码:java

SysUser类:json

@Entity
public class SysUser implements Serializable{

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue
	private Long uid;// 用户id
	
	@Column(unique=true)
	private String username;// 帐户
	
	private String name;// 名称
	
	private String password;
	
	private String salt;
	
	private byte state;
	
	@ManyToMany(fetch=FetchType.EAGER)
	@JoinTable(name="SysUserRole", 
				joinColumns= {@JoinColumn(name="uid", referencedColumnName="uid")}, 
				inverseJoinColumns= {@JoinColumn(name="roleId", referencedColumnName="id")})
	private List<SysRole> roleList;// 一个用户具备多个角色

SysRole类:fetch

@Entity
public class SysRole implements Serializable{

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue
	private Long id; 
	
	private String role;
	private String description;
	private Boolean available = Boolean.FALSE;// 是否可用
	
	// 多对多
	@ManyToMany(fetch=FetchType.EAGER)
	@JoinTable(name="SysRolePermission", 
			joinColumns= {@JoinColumn(name="roleId", referencedColumnName="id")}, 
			inverseJoinColumns= {@JoinColumn(name="permissionId", referencedColumnName="id")})
	private List<SysPermission> permissions;
	
	// 多对多
	@ManyToMany
	@JoinTable(name="SysUserRole", 
				joinColumns= {@JoinColumn(name="roleId", referencedColumnName="id")}, 
				inverseJoinColumns= {@JoinColumn(name="uid", referencedColumnName="uid")})
	private List<SysUser> users;

此处省略set get 和toString方法。ui

查询一个user时返回数据以下:url

{"uid":1,"username":"admin","name":"admin","password":"admin","salt":"d3c59d25033dbf980d29554025c23a75","state":1,"roleList":[{"id":1,"role":"admin","description":"管理员","available":true,"permissions":[{"id":1,"name":"用户管理","resourceType":"menu","url":"userInfo/userList","permission":"userInfo:view","parentId":0,"parentIds":"0/","available":true}]},{"id":2,"role":"vip","description":"VIP会员","available":true,"permissions":[{"id":1,"name":"用户管理","resourceType":"menu","url":"userInfo/userList","permission":"userInfo:view","parentId":0,"parentIds":"0/","available":true}]}]}{"uid":1,"username":"admin","name":"admin","password":"admin","salt":"d3c59d25033dbf980d29554025c23a75","state":1,"roleList":[{"id":1,"role":"admin","description":"管理员","available":true,"permissions":[{"id":1,"name":"用户管理","resourceType":"menu","url":"userInfo/userList","permission":"userInfo:view","parentId":0,"parentIds":"0/","available":true}]},{"id":2,"role":"vip","description":"VIP会员","available":true,"permissions":[{"id":1,"name":"用户管理","resourceType":"menu","url":"userInfo/userList","permission":"userInfo:view","parentId":0,"parentIds":"0/","available":true}]}]}{"uid":1,"username":"admin","name":"admin","password":"admin","salt":"d3c59d25033dbf980d29554025c23a75","state":1,"roleList":[{"id":1,"role":"admin","description":"管理员","available":true,"permissions":[{"id":1,"name":"用户管理","resourceType":"menu","url":"userInfo/userList","permission":"userInfo:view","parentId":0,"parentIds":"0/","available":true}]},{"id":2,"role":"vip","description":"VIP会员","available":true,"permissions":[{"id":1,"name":"用户管理","resourceType":"menu","url":"userInfo/userList","permission":"userInfo:view","parentId":0,"parentIds":"0/","available":true}]}]}...

后台报错StackOverFlow3d

问题缘由:根据查询结果可知,查询一定是经历了死循环,缘由是user类中有一个role集合,role类中有一个user集合code

解决方法:中断循环便可,首先这不是jpa的问题,是序列化的问题,咱们只要中断序列化就能够了,在user类中使用jackson的注解ip

@JsonIgnoreProperties(value = {"users"})get

代码以下:it

@JsonIgnoreProperties(value = {"users"})
	@ManyToMany(fetch=FetchType.EAGER)
	@JoinTable(name="SysUserRole", 
				joinColumns= {@JoinColumn(name="uid", referencedColumnName="uid")}, 
				inverseJoinColumns= {@JoinColumn(name="roleId", referencedColumnName="id")})
	private List<SysRole> roleList;
相关文章
相关标签/搜索