2011-11-02 94 views
24

我需要使用JPA說明我的數據庫創建一個連接表,所以結果會是這樣:如何使用JPA批註創建連接表?

enter image description here

到目前爲止,我只是實現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的實體嗎?或者我可以添加一些註釋,所以t當我運行從實體(ORM)創建表時,他會自動創建連接表?

我應該如何註釋我的實體以達到與圖像中相同的效果?

+2

組和用戶實體之間的基數是什麼?它是@OneToMany,以便每個組有0 .. *用戶?還是ManyToMany? – jFrenetic

+1

它是@OneToMany,因此每個組都有0 .. *個用戶,正如你所說的。一個用戶必須屬於一個,只有一個組,但一個組可以有很多(0 .. *)個用戶。 – sfrj

回答

28

你絕對不應該創建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; 
+0

你的意思是@ManyToMany? http://download.oracle.com/javaee/5/api/javax/persistence/ManyToMany.html – Jonathan

+1

@Jonathan no我的意思是@ @ OneToMany和@ ManyToOne,如示例中所示。爲什麼? –

+0

@PedroKowalski完美的工作。非常感謝:) – sfrj

6

我會實現它這個w AY:

@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建議應太,但隨後你必須在你的用戶實體,這並不總是可能集團實體的引用。

+0

嗯,這實際上取決於你是否想要一個單向或雙向的關係。我假設是雙向的,因爲用戶知道他屬於哪個組並知道哪些用戶在其中是合理的。當然,如果需要單向關係,那麼這個解決方案也很好。 –

4

具有相同的註解喜歡你的圖表中,你可以做到這一點在你的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; 
+0

爲什麼多到多?用戶必須屬於一個而且只屬於一個組?但是一個組可以有多個用戶。我知道這聽起來很罕見,但必須這樣。它不像Facebook那樣,用戶可以在許多組中,該組意味着該用戶在系統中的角色。而用戶只能有一個角色。 – sfrj

+0

mea culpa,我認爲目標是有很多關係 – user902383

+0

問題:如果我已經有這個額外的表? JoinTable不會覆蓋存在的一個權利? – TheWandererr

1

我想知道什麼是創建點考慮到我們無法直接訪問查詢,以這種方式加入表格? JPA不允許直接進行查詢的連接表,因此如果用戶想在USER_GROUP做手術,他要creare 用戶之間的正常連接查詢;由於這個原因,連接表USER_GROUP是無用的。

+0

Angel,這就是JPA的全部要點。在這種情況下,您不必爲其編寫查詢,因爲所有內容均表示爲對象。假設您有一個USER實體和一個COURSE實體。用戶可以有多個課程,並且課程可以分配給多個用戶。 (多對多關係,對嗎?)所以你想列出一個特定用戶的課程,這個課程在用戶實體中被定義爲一個變量(可能是List)。在這種情況下,您只需查找用戶,並且可以調用列表中的getter(),這會讓您返回他們的課程。您可以看到正在使用連接表。 –