2011-12-20 37 views
8

Có khả năng vô hiệu hóa bảng tham gia mối quan hệ @OneToMany với chú thích @JoinColumn. Mặc định là một bảng nối.OneToMany - sự khác nhau giữa bảng nối và khóa ngoài là gì?

Những ưu điểm và nhược điểm của hệ thống sản xuất chẳng hạn?
Khi nào tôi nên sử dụng bảng tham gia và khi nào thì không?

Cảm ơn bạn.

+0

Không cần sử dụng bảng quan hệ theo quan hệ 1: n. Hỏi chính xác hơn. –

+0

Theo mặc định, ánh xạ @OneToMany tạo bảng nối. Tôi không biết tại sao mặc định không được ánh xạ với khóa ngoài ... –

+1

Đoán của tôi là nó không cho hiệu suất hoặc rút lại, nhưng vì JPA thường giả định rằng tất cả các trường trong một bảng được ánh xạ trong thực thể tương ứng. Đây là một trường hợp cạnh vì nó là phổ biến hơn để có OneToMany với một ManyToOne trở lại. Với OneToMany một chiều bằng cách sử dụng joincolumn, nó đòi hỏi rằng bảng con có khóa ngoài, nhưng thực thể con không có tham chiếu đến cha của nó. – Chris

Trả lời

16

Theo mặc định @OneToMany sẽ chỉ tạo bảng tham gia nếu bạn sử dụng mối quan hệ một chiều.

Nói cách khác, nếu bạn có EmployeeProject tổ chức và đơn vị Employee được định nghĩa như sau (giả sử không có orm.xml mục cho các thực thể):

@Entity 
public class Employee { 
    // ... 

    @OneToMany 
    Set<Project> projects; 
} 

@Entity 
public class Project { 
    // ... 
} 

nhà cung cấp JPA sẽ tạo ra một bảng tham gia (thông báo không có thuộc tính mappedBy trong @OneToMany chú thích vì không có tham chiếu đến Employee pháp nhân từ Project).

Mặt khác, nếu bạn sẽ sử dụng mối quan hệ hai chiều:

@Entity 
public class Employee { 
    // ... 

    @OneToMany(mappedBy="employee") 
    Set<Project> projects; 
} 

@Entity 
public class Project { 
    // ... 

    @ManyToOne 
    Employee employee; 
} 

Bảng tham gia sẽ không được sử dụng, vì có "nhiều" phụ sẽ được sử dụng để lưu trữ các khóa ngoại cho mối quan hệ này.

Tuy nhiên, bạn có thể buộc sử dụng bảng tham gia ngay cả trong trường hợp khi bạn có mối quan hệ hai chiều @OneToMany với thuộc tính được xác định mappedBy. Bạn có thể đạt được nó bằng cách sử dụng chú thích @JoinTable về phía sở hữu của mối quan hệ.

Cũng có khả năng, như bạn đã đề cập, sử dụng @JoinColumn trong trường hợp bảng tham gia sẽ được sử dụng theo mặc định (quan hệ một chiều @OneToMany).

Tốt nhất bạn nên kiểm tra FK và tham gia hiệu suất bảng khác biệt cho chính mình. Tôi chỉ có thể đoán rằng ít tham gia (trong trường hợp này: FK) dường như có hiệu suất tốt hơn.

Hơn nữa, đôi khi DBA xác định lược đồ cơ sở dữ liệu và bạn chỉ cần khớp ánh xạ của bạn với lược đồ hiện có. Sau đó, bạn không có lựa chọn nào trên FK hoặc tham gia bảng - đó là lý do tại sao bạn có lựa chọn.

+0

Hibernate là rõ ràng về nó: "Một một chiều đến nhiều với bảng tham gia được nhiều ưa thích. Hiệp hội này được mô tả thông qua một @ JoinTable." http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e1168 phần "2.2.5.3.1.3. Unidirectional với bảng tham gia" – lko

0

Tham gia các bảng là cần thiết cho đa hình. Ví dụ: nếu Nhân viên và Người quản lý liên kết cùng một dự án và họ được ánh xạ với chiến lược một bảng mỗi lớp, ở cấp DB quan hệ, cách duy nhất để biết dự án đó (id = 1, emp_id = 10) là người quản lý là đặt emp_id trong bảng manager_2_employee. Nếu một người không ở trong tình huống như vậy, thì emp_id có thể đi thẳng vào dự án.

+0

Xem ưu điểm của bảng tham gia http://stackoverflow.com/câu hỏi/1307203/hibernate-unidirectional-one-to-many-association-why-is-a-join-table-better –

0

Như đã đề cập trong các nhận xét ở trên, theo mặc định ngủ đông đi cho bảng tham gia. Điều này dẫn đến việc chuẩn hóa db tốt hơn.

Nếu có lựa chọn, JoinColumn cho hiệu năng tốt hơn trên bảng nối khi cần phải nối thêm bảng trong truy vấn SQL.

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