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ó Employee
và Project
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.
Nguồn
2011-12-20 16:05:34
Không cần sử dụng bảng quan hệ theo quan hệ 1: n. Hỏi chính xác hơn. –
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 ... –
Đ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