spring boot 整合 jpa (三) -- 之表关系映射

版权声明:[ws - 兮的博客] - 空间专属,未经声明不得私自转载 https://blog.csdn.net/qq_41463655/article/details/82939791

spring boot 整合 jpa (一) – 之基础配置
https://blog.csdn.net/qq_41463655/article/details/82939481
spring boot 整合 jpa (二) – 之数据操作
https://blog.csdn.net/qq_41463655/article/details/82939560

@Entity
1、数据库不存在表会自动创建表
2、数据库不存在某些字段数据库会自动创建该字段
指定了外键关系会自动在数据库中生成外键

User 用户类

@Table(name = "ws_user")   //生成数据库的表名
@Entity  // 该注解声明一个实体类,与数据库中的表对应
public class User {

    @Id               //  表明主键id
    @GeneratedValue   //  主键的生成策略(看最下方注释具体说明)
    private Long userId;

    private String username;

    private String password;


    //======================= 用户 - [ 一对一 ] - 用户详情 ================

    // @JoinColumn(name = "user_id")      //外键关联
    @PrimaryKeyJoinColumn                 //主键关联
    @OneToOne(cascade=CascadeType.ALL)    //ALL 级联/添加/更新/删除(看最下方注释具体说明)
    // 用户详情类
    private UserDetail de![在这里插入图片描述](https://img-blog.csdn.net/2018100419254813?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDYzNjU1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)tail;           


    //======================= 用户 - [ 一对多 ] - 收获地址 ===============

    //外键关联,指定一的一端的id 做外键
    @JoinColumn(name = "user_id")
    @OneToMany(cascade=CascadeType.ALL)
    // 地址类
    private List<Address> addresses;


    //======================= 用户 - [ 多对一 ] - 部门  ================

    //外键关联,指定一的一端的id 做外键
    @JoinColumn(name = "dep_id")
    @ManyToOne(cascade=CascadeType.ALL)
     // 部门类
    private Dep dep;

    //======================= 用户 - [ 多对多 ] - 角色 ===================
    
    //name指中间表的表名,joinColumns指当前实体在中间表的字段,inverserJoinCloumns指关联的另外一个实体在中间表的字段名
    @JoinTable(name="ws_user_role",joinColumns=@JoinColumn(name="user_id"),inverseJoinColumns=@JoinColumn(name="role_id"))
    @ManyToMany(cascade=CascadeType.ALL)
    //角色类
    private List<Role> roles;
 
  set,get 方法自行添加........
  
//详细注解说明
// ================================= 表关系注解说明  ================================

// @JsonIgnore   //将不需要返回的属性上添加忽略,多为复杂表关系属性排除使用
//@Transient 注解,表明为成员变量,不和数据库字段做映射
/*
*      @OneToOne      一对一
*      @OneToMany     一对多
*      @ManyToOne     多对一
*      @ManyToMany    多对多
*
*       上诉关系指定后添加的属性
*       cascade:表示默认的级联操作策略,可以指定为ALL(全部),默认为无级联操作
*            PERSIST(级联保存),
*            MERGE  (级联更新),
*            REFRESH(级联刷新)
*            REMOVE (级联删除)
*       fetch:表示抓取策略,默认为FetchType.EAGER ,
*            EAGER(急记载,立即记载)
*            LAZY(懒加载)
*       optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true
**/

// ================================= 属性注解 @Column 说明  ================================

/*
 *
 *     @Column: 指定生成的表字段名和长度,不指定默认255长度且表字段名同属性名一致
 *
 *     指定字段 tradeNo 长度为50,且值不能为null
 *         @Column(name = "tradeNo", length = 50, nullable = false)
 *
 *     指定字段 tradeNo 长度为50,且值可以为null
 *         @Column(name = "tradeNo", length = 50, nullable = true)
 *
 *     指定字段totalAmount(长度)为10,小数点位数为2位,且值不能为null
 *         @Column(name = "totalAmount", precision = 10, scale = 2, nullable = false)
 *
 **/
// =============================== 主键策略 @GeneratedValue 说明  ============================

   /**   @GeneratedValue  主键id  -->  生成策略注解说明
     *   @GeneratedValue(strategy=GenerationType.AUTO)  //示范
     *   –IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle 不支持这种方式; 
     *   –AUTO:    JPA自动选择合适的策略,是默认选项; 
     *   –SEQUENCE:通过序列产生主键,通过@SequenceGenerator 注解指定序列名,MySql不支持这种方式 
     *   –TABLE:   通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
     **/

指定关系后,查询用户就可以把用户关联其他表的所有数据查询出来了
调用 controller 的查询方法获得

[{“userId”:2,“username”:“小微”,“password”:“123”,“detail”:{“detailId”:2,“nickname”:“17603093954”},“addresses”:[{“id”:3,“province”:“泥南乡”,“city”:“宜宾”}],“dep”:{“depId”:2,“name”:“管理”},“roles”:[{“roleId”:1,“name”:“开发”}]},{“userId”:1,“username”:“王松”,“password”:“123”,“detail”:{“detailId”:1,“nickname”:“17628689969”},“addresses”:[{“id”:1,“province”:“红星桥”,“city”:“成都”},{“id”:2,“province”:“泥南乡”,“city”:“宜宾”}],“dep”:{“depId”:1,“name”:“技术”},“roles”:[{“roleId”:1,“name”:“开发”},{“roleId”:2,“name”:“测试”}]}]

格式化查看

在这里插入图片描述

用户详情类

import javax.persistence.*;

/**
 * Created by Administrator on 2018/10/3/003.
 * 用户详情类
 */

@Table(name = "ws_detail")
@Entity
public class UserDetail {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) //  主键的生成策略
    private Long detailId;

    private String nickname;
    
    //省略set,get.......
}

收获地址类

/**
 * Created by Administrator on 2018/10/3/003.
 * 收获地址类
 */

@Table(name="ws_address")
@Entity
public class Address {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;

    private String province;

    private String city;

    //省略set,get.......
}

部门类

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * Created by Administrator on 2018/10/3/003.
 * 部门类
 */
@Table(name = "ws_dep")
@Entity
public class Dep {

    @Id
    @GeneratedValue
    private Long depId;

    private String name;

    //省略set,get.......
}

角色类

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * Created by Administrator on 2018/10/3/003.
 * 角色类
 */

@Table(name = "ws_role")
@Entity
public class Role {

    @Id
    @GeneratedValue
    private Long roleId;

    private String name;

   //省略set,get.......
   }

猜你喜欢

转载自blog.csdn.net/qq_41463655/article/details/82939791