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

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<>();
}
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解析返回的时候会出现溢出异常。

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

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

05-28 07:45