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?
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
Đó 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