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<>();
}
有问题可以在下面评论,技术问题可以私聊我。