2012-12-14 45 views
7

Tôi đang làm việc trên hệ thống cũ, cần phải đọc một số thông tin từ cơ sở dữ liệu. Dưới đây là những mối quan hệ bảngMột đến nhiều liên kết - Tham gia các bảng có cột khóa không chính trong JPA

Vendor (VendorID - pk, vendorEid, tên)
VendorContactBridge (bridgeId -pk, vendorEid, contactEid)
Liên (ContactId -pk, contactEid, điện thoại)

vendorEid và contactEid không phải là khóa chính của bảng nhưng được sử dụng làm cột nối trong bảng Tham gia VendorContactBridge.

Vendor Entity -

@Entity 
@Table(name="Vendor") 
public class Vendor implements Serializable{ 

@Id 
@Column(name="VENDORID") 
private BigDecimal vendorId; 

@Column(name="VENDOREID") 
private BigDecimal vendorEid; 

@OneToMany(fetch = FetchType.EAGER) 
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")}, 
inverseJoinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTACTEID")}) 
private Set<Contact> vendorContact; 
} 

Liên Entity -

@Entity 
@Table(name="CONTACT") 
public class Contact implements Serializable{ 

@Id 
@Column(name="CONTACTID") 
private BigDecimal contactId; 

@Column(name="CONTATEID") 
private BigDecimal contactEId; 

@ManyToOne 
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTATEID")}, 
inverseJoinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")}) 
private Vendor vendor; 
} 

khi chạy truy vấn, nhận được dưới đây ngoại lệ

SecondaryTable JoinColumn không có thể tham khảo một chìa khóa phi chính.

Tôi đã xóa tìm nạp Eager mà tôi đã cung cấp trong thực thể Nhà cung cấp, tôi không nhận được ngoại lệ nào nhưng không tải bộ sưu tập. Có gì sai với hiệp hội?

Trả lời

10

Theo JPA 2.0 specs đoạn 11.1.21 JoinColumn annotaion trên trang 379

Hỗ trợ cho các cột tham chiếu mà không phải là cột khóa chính của bảng tham chiếu là không bắt buộc. Các ứng dụng sử dụng ánh xạ như vậy sẽ không thể di chuyển được.

Có vẻ như Hibernate chọn không triển khai phần tùy chọn này. Các triển khai khác có thể. Tôi đã thử nó trên EclipseLink nhưng một trong đó không hoạt động (hoặc nó không xác nhận).

Tôi thấy hai công việc xung quanh. Một là để điều chỉnh lược đồ của bạn để sử dụng các khóa chính sẽ là điều đúng đắn từ quan điểm lý thuyết thiết kế cơ sở dữ liệu. Tuy nhiên, đó có thể không phải là một lựa chọn vì phần mềm khác tùy thuộc vào lược đồ này để lại tùy chọn hai. Làm việc xung quanh nó bằng cách KHÔNG moddeling mối quan hệ trong JPA chỉ sử dụng eid và lấy các đối tượng có liên quan cho mình.

+0

Lựa chọn 2: Bạn có nghĩa là, tôi nên làm cho hai db gọi một cho nhận ContactEid từ VendorContactBridge dựa trên VendorEid và một lần nữa vào Liên ased trên ContactEid? Tôi hiểu có đúng không ? – Pankaj

+0

Đó sẽ là nguyên tắc cơ bản. Nhưng tốt nhất nên sử dụng truy vấn gốc vì bạn có thể thực hiện một phép nối và do đó sử dụng một truy vấn sql đơn lẻ để truy xuất các đối tượng. – Eelke

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