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

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

  • 相关阅读:
    应用层
    传输层
    一元函数微分学
    函数、极限、连续
    网络层习题与真题
    网络层
    数据链路层习题与真题
    二、使用kubeadm部署k8s
    一、Kubernetes概述
    二、rsync文件同步
  • 原文地址:https://www.cnblogs.com/c1024/p/11011999.html
Copyright © 2020-2023  润新知