jhipster入門疑問之三

無連接的N-1

無連接也就是不需要第三張表,維護我們的關聯關係。對於N_1關聯關係,我們只需要在N的一端增加一列外鍵即可。讓外鍵的值記錄到該屬性的實體即可。Hibernate使用@JoinColumn來修飾代表關聯實體的屬性,用於映射底層的外鍵列。這種就不使用連接表了

好啦,我們看一下例子

/**
 * @version 1.0.0
 * @項目名稱: yusp-uaa
 * @類名稱: AdminSmUser
 * @類描述: 系統用戶表實體
 * @功能描述:
 * @創建人: liuhua@********
 * @創建時間: 2017-12-12 09:51
 * @修改備註:
 * @修改記錄: 修改時間    修改人員    修改原因
 * -------------------------------------------------------------
 * @Copyright (c) 2017*******
 */
@Entity
@Table(name = "ADMIN_SM_USER")
public class AdminSmUser implements Serializable {

    private static final long serialVersionUID = -1654620673909327705L;
    private String userId;
    private String loginCode;
    private String userName = " ";
    private String certType = "1";
    private String certNo;
    private String userCode;
    private Time deadline;
    private String orgId ;
    private String dptId;
    private String userPassword;
    private String userSex;
    private Time userBirthday;
    private String userEmail;
    private String userMobilephone;
    private String userOfficetel;
    private String userEducation;
    private String userCertificate;
    private Time entrantsDate;
    private String positionTime;
    private String financialJobTime;
    private String positionDegree;
    private String userAvatar;
    private String offenIp;
    private String userSts = "1";
    private String lastLoginTime;
    private Time lastEditPassTime;
    private String lastChgUsr = SecurityUtils.getCurrentUserLogin();
    private String lastChgDt = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
    private AdminSmDpt adminSmDpt;
    private Set<AdminSmRole> authorities = new HashSet<>();
    private AdminSmOrg adminSmOrg;
    /*@Transient
    private AdminSmOrg adminSmOrg;
    @Transient
    private AdminSmDpt adminSmDpt;*/

    @Id
    @Column(name = "USER_ID")
  /*  @GeneratedValue(generator = "uuid2" )
    @GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator" )*/
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid")
    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    @NotNull
    @Basic
    @Column(name = "LOGIN_CODE")
    public String getLoginCode() {
        return loginCode;
    }

    public void setLoginCode(String loginCode) {
        this.loginCode = loginCode;
    }

    @Basic
    @Column(name = "USER_NAME")
    public String getUserName() {
        return userName;
    }
   // ************省略相似代碼

   // 注意這裏註解

     //    @JsonIgnore
    ***@ManyToMany
    @JoinTable(
        name = "ADMIN_SM_USER_ROLE_REL",
        joinColumns = {@JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID")},
        inverseJoinColumns = {@JoinColumn(name = "ROLE_ID", referencedColumnName = "ROLE_ID")})
    @BatchSize(size = 20)***
    public Set<AdminSmRole> getAuthorities() {
        return authorities;
    }

    public void setAuthorities(Set<AdminSmRole> authorities) {
        this.authorities = authorities;
    }


/*
    //    @JsonIgnore
   *//* @ManyToOne(cascade = {CascadeType.REFRESH})
    @JoinColumn(name = "ORG_ID", referencedColumnName = "ORG_ID", insertable = false, updatable = false)*//*
    public AdminSmOrg getAdminSmOrg() {
        return adminSmOrg;
    }

    public void setAdminSmOrg(AdminSmOrg adminSmOrg) {
        this.adminSmOrg = adminSmOrg;
    }

    //    @JsonIgnore
    *//*@ManyToOne(cascade = {CascadeType.REFRESH})
    @JoinColumn(name = "DPT_ID", referencedColumnName = "DPT_ID", insertable = false, updatable = false)*//*
    public AdminSmDpt getAdminSmDpt() {
        return adminSmDpt;
    }

    public void setAdminSmDpt(AdminSmDpt adminSmDpt) {
        this.adminSmDpt = adminSmDpt;
    }*/

    @ManyToOne(targetEntity=AdminSmDpt.class,cascade = {CascadeType.REFRESH})
    @JoinColumn(name="DPT_ID",referencedColumnName="DPT_ID",insertable = false, updatable = false)
    public AdminSmDpt getAdminSmDpt() {
        return adminSmDpt;
    }

    public void setAdminSmDpt(AdminSmDpt adminSmDpt) {
        this.adminSmDpt = adminSmDpt;
    }

以上是用戶實體類
接下來看裏面的用得到的兩個典型例子一個是role角色表實體類,和dpt部門實體類。其中角色和用戶是多對多的關係就是說一個用戶可以承擔多個角色,一個角色可以多人承擔,用戶和部門就是多對一的關係了一個用戶只能屬於一個部門。兩個註解是不一樣的。參考相關大神的描述學習了一下。
當然最重要的特點步是對應關係,而是表關係,其中用戶角色表有一個關聯關係表,看下圖。
這裏寫圖片描述
這就引出了連接關係的區別,進而註解也不一樣
下邊是學習是的講解

//這裏首先是這個註解joincolumn指出的是兩個表的關聯屬性,其中name是該實體類的對應的表中的外鍵名,referencecolumnname是指關聯的表中與之對應的字段名稱。
joinColumns = {@JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID")},

首先是第三個表維護關聯關係的

我們的關聯關係的維護讓第三張表來維護啦。對於大部分的N_1單向關係,只要基於外鍵的關聯關係維護已經夠了。
如果有需要使用連接表來維護關聯關係,程序可以使用連接表顯示的維護這種關係,所謂連接表就是建立第三張表格來維護我們的關係就行了。使用@JoinTable

下面的是java給的例子,除了這些屬性外,我們還可以指定targetEntity。指定關聯的實體是哪個!也就是生成表的是哪個表所對應的實體。`

 @ManyToMany
    @JoinTable(
    //第三張關聯表的表明name
        name = "ADMIN_SM_USER_ROLE_REL",
        //當前實體類對應的表與關聯表的外鍵對應關係
        joinColumns = {@JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID")},
        //關聯表與真正要連接的實體表之間的外鍵對應關係。裏面的參數意思就和單個joincolumn是一樣的。
        inverseJoinColumns = {@JoinColumn(name = "ROLE_ID", referencedColumnName = "ROLE_ID")})
    @BatchSize(size = 20)
    public Set<AdminSmRole> getAuthorities() {
        return authorities;
    }

    public void setAuthorities(Set<AdminSmRole> authorities) {
        this.authorities = authorities;
    }

沒有第三張表的情況(比較常用)

無連接也就是不需要第三張表,維護我們的關聯關係。對於N_1關聯關係,我們只需要在N的一端增加一列外鍵即可。讓外鍵的值記錄到該屬性的實體即可。Hibernate使用@JoinColumn來修飾代表關聯實體的屬性,用於映射底層的外鍵列。這種就不使用連接表了

 @ManyToOne(targetEntity=AdminSmDpt.class,cascade = {CascadeType.REFRESH})
    @JoinColumn(name="DPT_ID",referencedColumnName="DPT_ID",insertable = false, updatable = false)
    public AdminSmDpt getAdminSmDpt() {
        return adminSmDpt;
    }

直接使用該註解就好了。
但是使用中有個疑問點:
insertable與updatable剛開始沒有添加,運行會報錯,要求必須加上。
正在研究。

發佈了32 篇原創文章 · 獲贊 10 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章