![](/img/trans.png)
[英]JPA Annotations - how to merge two fields into one column for a join table?
[英]How to create join table with JPA annotations?
我需要使用JPA
注釋在我的數據庫中創建一個連接表,結果將是這樣的:
到目前為止,我剛剛實施了2個實體
@Entity
@Table(name="USERS", schema="ADMIN")
public class User implements Serializable {
private static final long serialVersionUID = -1244856316278032177L;
@Id
@Column(nullable = false)
private String userid;
@Column(nullable = false)
private String password;
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {
private static final long serialVersionUID = -7274308564659753174L;
@Id
@Column(nullable = false)
private String groupid;
public String getGroupid() {
return groupid;
}
public void setGroupid(String groupid) {
this.groupid = groupid;
}
}
我應該創建另一個名為USER_GROUP
實體,或者我可以添加一些注釋,因此當我從實體(ORM)運行創建表時,將自動創建連接表嗎?
我應該如何注釋我的實體以實現與圖像中相同的效果?
你絕對不應該創建User_Group實體,因為它更像是基礎數據庫表示而不是面向對象的實體。
您可以通過定義以下內容來實現連接表:
@Entity
@Table(name="USERS", schema="ADMIN")
public class User implements Serializable {
//...
@ManyToOne
@JoinTable(name="USER_GROUP")
Group group;
@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {
//...
@OneToMany(mappedBy="group")
Set<User> users;
編輯:如果要顯式設置列的名稱,可以使用@JoinColumn元素,如下所示:
@ManyToOne
@JoinTable(name="USER_GROUP",
joinColumns = @JoinColumn(name = "userid",
referencedColumnName = "userid"),
inverseJoinColumns = @JoinColumn(name = "groupid",
referencedColumnName = "groupid"))
Group group;
我會這樣實現它:
@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {
@OneToMany
@JoinTable(name = "USER_GROUP",
joinColumns = @JoinColumn(name = "groupid"),
inverseJoinColumns = @JoinColumn(name = "userid"))
private List<User> users;
}
@PedroKowalski建議的解決方案也應該有效,但是您必須在用戶實體中保留對Group實體的引用,這並不總是可行的。
要在圖表中使用相同的注釋,可以在User
類中執行此User
:
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "USER_GROUP",
joinColumns = { @JoinColumn(name = "userid") },
inverseJoinColumns = { @JoinColumn(name = "groupid") })
private List<Group> grups;
在你的小組課堂上
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "USER_GROUP",
joinColumns = { @JoinColumn(name = "groupid") },
inverseJoinColumns = { @JoinColumn(name = "userid") })
private List<User> users;
我想知道以這種方式創建連接表有什么意義,考慮到我們無法直接訪問查詢? JPA不允許直接向Join Table進行查詢,因此如果用戶想要對USER_GROUP進行操作,他必須在用戶和組之間進行正常的連接查詢; 因此,連接表USER_GROUP是無用的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.