1. 程式人生 > >spring boot 整合 jpa (三) -- 之表關係對映

spring boot 整合 jpa (三) -- 之表關係對映

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",
[email protected]
(name="user_id"),[email protected](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.......
   }