2011-11-02 13 views
24

tôi cần phải tạo ra một bảng tham gia trong cơ sở dữ liệu của tôi sử dụng JPA chú thích sao cho kết quả sẽ là thế này:Làm cách nào để tạo bảng nối với chú thích JPA?

enter image description here

Cho đến nay tôi chỉ thực hiện 2 thực thể:

@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; 
    } 
} 

Tôi có nên tạo một thực thể khác có tên là USER_GROUP hoặc tôi có thể thêm một số chú thích, vì vậy, t ông tham gia bảng sẽ được tạo ra tự động khi tôi chạy tạo bảng từ thực thể (ORM)?

Tôi nên chú thích các thực thể của mình để đạt được giống như trong hình ảnh như thế nào?

+2

Cardinality giữa nhóm và các thực thể người dùng là gì? Có phải @OneToMany, để mỗi nhóm có 0 .. * người dùng? Hay là ManyToMany? – jFrenetic

+1

Đây là một @OneToMany, do đó mỗi nhóm có 0 .. * người dùng, như bạn đã nói. Người dùng phải thuộc về một và chỉ một nhóm, nhưng một nhóm có thể có nhiều người dùng (0 .. *). – sfrj

Trả lời

28

Bạn chắc chắn không nên tạo đối tượng User_Group vì nó biểu diễn cơ sở dữ liệu cơ sở hơn so với biểu diễn cơ sở dữ liệu hướng đối tượng.

Bạn có thể đạt được tham gia vào bảng bằng cách định nghĩa một cái gì đó như:

@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; 

Edit: Nếu bạn muốn thiết lập một cách rõ ràng tên của các cột mà bạn có thể sử dụng các yếu tố như @JoinColumn được hiển thị bên dưới:

@ManyToOne 
@JoinTable(name="USER_GROUP", 
    joinColumns = @JoinColumn(name = "userid", 
           referencedColumnName = "userid"), 
    inverseJoinColumns = @JoinColumn(name = "groupid", 
           referencedColumnName = "groupid")) 
Group group; 
+0

Ý của bạn là @ManyToMany? http://download.oracle.com/javaee/5/api/javax/persistence/ManyToMany.html – Jonathan

+1

@ Jonathan không có nghĩa là '@ OneToMany' và' @ ManyToOne' như được hiển thị trong ví dụ. Tại sao? –

+0

@PedroKowalski Điều đó hoạt động hoàn hảo. Cảm ơn bạn rất nhiều :) – sfrj

6

Tôi sẽ triển khai nó 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; 
} 

Giải pháp được đề xuất bởi @PedroKowalski nên làm việc quá, nhưng sau đó bạn sẽ phải giữ một tham chiếu đến Nhóm thực thể trong tài thực thể của bạn mà không phải lúc nào cũng tốt.

+0

Vâng, nó thực sự phụ thuộc vào nếu bạn muốn có một mối quan hệ độc lập hoặc hai chiều. Tôi đã giả định hai chiều, vì nó có vẻ hợp lý để Người dùng biết Nhóm nào anh ta thuộc về và Nhóm để biết Người dùng ở trong đó. Tất nhiên nếu mối quan hệ một chiều là cần thiết, hơn là giải pháp này cũng tốt. –

4

Để có cùng các chú thích như thế nào trong sơ đồ của bạn, bạn có thể làm điều này trong lớp User của bạn:

@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "USER_GROUP", 
      joinColumns = { @JoinColumn(name = "userid") }, 
      inverseJoinColumns = { @JoinColumn(name = "groupid") }) 
private List<Group> grups; 

trong lớp học nhóm của bạn

@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "USER_GROUP", 
      joinColumns = { @JoinColumn(name = "groupid") }, 
      inverseJoinColumns = { @JoinColumn(name = "userid") }) 
private List<User> users; 
+0

Vì sao nhiều người? Người dùng phải thuộc về một và chỉ một nhóm? Nhưng một nhóm có thể có nhiều người dùng. Tôi biết nó nghe có vẻ hiếm hoi, nhưng nó phải như vậy. Nó không giống như facebook nơi một người dùng có thể ở trong nhiều nhóm, nhóm có nghĩa là vai trò của người dùng đó trong hệ thống. Và người dùng chỉ có thể có một vai trò. – sfrj

+0

mea culpa, tôi nghĩ mục tiêu là có mối quan hệ nhiều2many – user902383

+0

Câu hỏi: nếu tôi đã có bảng bổ sung này thì sao? Các JoinTable sẽ không ghi đè lên một existign phải không? – TheWandererr

1

Tôi đang tự hỏi là những gì các điểm để tạo ra một Bảng Tham gia theo cách này, xem xét rằng chúng tôi không thể truy cập trực tiếp cho các truy vấn? JPA không cho phép để thực hiện các truy vấn trực tiếp đến tham Bảng, vì vậy nếu người dùng muốn làm một thao tác trên USER_GROUP, ông đã để creare một truy vấn tham gia bình thường giữa người dùngnhóm; do đó, bảng tham gia USER_GROUP là vô dụng.

+0

Thiên thần, đó là toàn bộ điểm của JPA. Trong trường hợp này, bạn không phải viết truy vấn cho nó, vì mọi thứ được biểu diễn như một đối tượng. Giả sử bạn có một thực thể USER và một thực thể COURSE. Người dùng có thể có nhiều khóa học và một khóa học có thể được chỉ định cho nhiều người dùng. (Nhiều đến nhiều mối quan hệ, phải không?) Vì vậy, bạn muốn liệt kê một khóa học cụ thể của người dùng được định nghĩa là một biến (có thể là Danh sách) tại Thực thể người dùng. Trong trường hợp này, bạn chỉ cần tra cứu người dùng, và bạn có thể gọi cho getter() của danh sách, nó sẽ trả về các khóa học của họ. Bạn có thể thấy rằng bảng kết nối đang được sử dụng. –

Các vấn đề liên quan