jhipster入門疑問之三
無連線的N-1
無連線也就是不需要第三張表,維護我們的關聯關係。對於N_1關聯關係,我們只需要在N的一端增加一列外來鍵即可。讓外來鍵的值記錄到該屬性的實體即可。Hibernate使用@JoinColumn來修飾代表關聯實體的屬性,用於對映底層的外來鍵列。這種就不使用連線表了
好啦,我們看一下例子
/**
* @version 1.0.0
* @專案名稱: yusp-uaa
* @類名稱: AdminSmUser
* @類描述: 系統使用者表實體
* @功能描述:
* @建立人: [email protected]********
* @建立時間: 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剛開始沒有新增,執行會報錯,要求必須加上。
正在研究。