簡體   English   中英

如何使用JPA注釋創建連接表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM