JPA中关联关系(OneToOne、OneToMany、ManyToMany,ManyToOne)映射代码片段

在使用Hibernate的时候我们常常会在类里边配置各种的关联关系,但是这个并不是很好配置,配置不当会出现各种各样的问题,下面具体来看一下:

首先我们来看User类里边有一个IdentityCard类,是个身份证类,那么用户和身份证就是一个一对一的关系,@OneToOne的映射关系。

package com.xz.springcloud.user;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonManagedReference;

import lombok.Data;
import lombok.ToString;

@Data
//@ToString
@Entity
@Table(name="s_user")
public class User {

	@Id
	@GeneratedValue(strategy= GenerationType.AUTO)
	private Long id;
	private String username;
	private String password;
	private Integer age;
	private String gender;
	private String address;
	private String province;
	private String city;
	private String area;
	private Integer state;
	
	/**
	 * 注意看这里,双向一对第一
	 * 懒加载
	 */
	@OneToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="identity_card")
	private IdentityCard identityCard;
	
	@JsonManagedReference
	@ManyToMany(cascade=CascadeType.ALL)
	@JoinTable(name="user_roles",joinColumns= {@JoinColumn(name="user_id")},inverseJoinColumns= {@JoinColumn(name="role_id")})
	private List<Role> roles = new ArrayList<>();
}

接下来我们来看IdentityCard的定义

package com.xz.springcloud.user;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonBackReference;

import lombok.Data;
import lombok.ToString;

/**
 * 身份证类
 * @author yuxuan
 *
 */
@Data
//@ToString
@Entity
@Table(name="s_identity_card")
public class IdentityCard implements Serializable{

	@Id
	@GeneratedValue(strategy= GenerationType.AUTO)
	private Integer id;
	//身份证编号
	private String number;
	
	@JsonBackReference
	@OneToOne(mappedBy="identityCard")
	private User user;
}

看到这里可能有的人会问@JsonBackReference是个什么鬼,这个注解是为了阻断循环依赖,或者使用@JsonIgnore也行。在双向一对一或者一多的时候会产生循环依赖的问题,就是我中有你,你中有我。会一直无限循环下去,主要防止在SpringMVC中JSON解析返回的时候会出现溢出异常。

另外我们来看下Role类的定义,他和User类似多对多的,一个用户可以对应多个角色,一个角色可以对应多个用户

package com.xz.springcloud.user;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonBackReference;

import lombok.Data;
import lombok.ToString;

@Data
//@ToString
@Entity
@Table(name="s_role")
public class Role {

	@Id
	@GeneratedValue(strategy= GenerationType.AUTO)
	private Long id;
	private String roleName;
	private Integer userId;
	
	@JsonBackReference
	@ManyToMany(cascade=CascadeType.ALL)
	@JoinTable(name="user_roles",joinColumns= {@JoinColumn(name="role_id")},inverseJoinColumns= {@JoinColumn(name="user_id")})
	private List<User> users = new ArrayList<>();
	
}

有问题可以在下面评论,技术问题可以私聊我。

posted @ 2019-05-25 15:14  坐看云起时_雨宣  阅读(414)  评论(0编辑  收藏  举报