2012-01-07 19 views
5

Câu hỏi này nằm trong bối cảnh có vấn đề được đề cập trong this thread. Tôi cũng phải đối mặt với cùng một vấn đề trong khi sử dụng JPA trên MySQL. Tôi có thể giải quyết nó chỉ khi tôi thay đổi chiến lược thế hệ thành TABLE.Không thể sử dụng tạo khóa cột danh tính với chiến lược TABLE_PER_CLASS trong JPA?

Nhưng câu hỏi đặt ra là, lý do đằng sau vấn đề này là gì và tại sao thay đổi chiến lược thành BẢNG là giải pháp (điều này vẫn chưa được trả lời trong the thread)?

Trả lời

9

Để có id duy nhất thông qua phân cấp thừa kế (mà JPA yêu cầu), bạn rõ ràng không thể làm điều đó với TABLE_PER_CLASS và IDENTITY vì IDENTITY hoạt động ngoài bảng và hiện có nhiều bảng "gốc" trong hệ thống phân cấp thừa kế.

ví dụ: lớp cơ sở trừu tượng "Cơ sở" và các lớp con "Sub1", "Sub2", "Sub3". Vì vậy, bạn có các bảng thực tế "SUB1", "SUB2", "SUB3". Vì vậy, nếu sử dụng IDENTITY thì điều này sẽ tương đương với một cái gì đó như "autoincrement" trên một cột khi sử dụng MySQL. Do đó SUB1 có id của nó, SUB2 có id của nó, và SUB3 có id của nó ... và chúng độc lập, do đó có thể nhận được va chạm trong id ... do đó bạn không còn có id duy nhất trong hệ thống phân cấp thừa kế.

+0

Cảm ơn rất nhiều vì đã làm rõ !!! –

+0

Giải thích hoàn hảo, cảm ơn – 91K00

0

Câu trả lời được chấp nhận (mặc dù cũ) không hoàn toàn chính xác. Sử dụng GenerationType.IDENTITY không ngụ ý rằng việc tạo bảng được sử dụng bởi DB. Javadoc cho GenerationType.IDENTITY nói: "Chỉ ra rằng nhà cung cấp persistence phải gán các khóa chính cho thực thể bằng cách sử dụng cột nhận dạng cơ sở dữ liệu.".

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