2010-07-05 52 views
10

Tôi có bảng MySQL không có khóa chính và tôi phải ánh xạ nó vào thực thể JPA. Tôi không thể sửa đổi bảng theo bất kỳ cách nào.Thực thể JPA cho một bảng không có khóa chính

Vì thực thể phải có khóa chính, tôi phải chỉ định một khóa. Nếu tôi chắc chắn rằng trường tôi sử dụng làm khóa chính trong thực thể (hoặc các trường, tôi nên chọn sử dụng khóa tổng hợp chính) sẽ luôn là duy nhất (và không phải là null) trong bảng, thực tế là bảng đó không không có khóa chính được chỉ định trong CREATE TABLE gây ra bất kỳ sự cố nào?

Trả lời

8

Đúng vậy. JPA không có cách nào để biết liệu (các) cột mà nó đang sử dụng như một PK thực sự là một PK thực sự trong cơ sở dữ liệu hay không. Nếu những cột đó là, trong thực tế, một PK, thì nó sẽ ổn thôi.

Bạn có thể gặp một số vấn đề về hiệu năng nếu các cột giả PK không được lập chỉ mục chính xác, mặc dù - JPA sẽ thực thi các truy vấn đối với PK với giả định rằng nó sẽ hoạt động tốt.

2

Bản thân JPA không phân tích cơ sở dữ liệu của bạn. Chỉ cần không sử dụng các phương thức phổ biến bằng cách sử dụng khóa chính (find/merge/...) thay vì sử dụng các truy vấn có tên, ví dụ bằng cách sử dụng cú pháp cập nhật jpql.

@Entity 
@Table(name = "login") 
@NamedQueries({ 
     @NamedQuery(name = "Login.updateLastOnline", 
     query = "UPDATE Login l SET l.lastOnline = :newDate WHERE l.loginId = :loginId") 
     }) 
public class Login implements Serializable 
{ 

Nó không quan trọng nếu loginId là chính chìa khóa

+0

Tại sao có thể tìm và kết hợp các vấn đề nguyên nhân? – tputkonen

+0

@tputkonen - có thể tôi không viết rõ ràng, nhưng tôi đã cố gắng nói, rằng bạn CÓ THỂ tránh sử dụng tìm/hợp nhất bằng cách sử dụng JPQL. – Dewfy

+0

Tôi đồng ý với điều đó, nó chỉ là chúng tôi đã trải qua một số hành vi lạ khi sử dụng hợp nhất với các bảng như vậy, và nó sẽ là tốt để biết lý do – tputkonen

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