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

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

程序员文章站 2022-04-22 16:10:15
...

在使用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<>();
	
}

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