Khái niệm kế thừa của JPA dựa trên các bảng thông thường. Nó không thực sự "hiểu" ý tưởng về sự kế thừa bảng của PostgreSQL. Đó là một trong những chi phí làm việc với một thông số kỹ thuật được thiết kế để đưa ra mẫu số chung thấp nhất của các tính năng và làm như vậy một cách linh hoạt.
Xem hướng dẫn này để có một bản tóm tắt phù hợp về các chiến lược kế thừa JPA. Lưu ý rằng trong Java 6 JavaDoc mới hơn cho @Inheritance có một ghi chú nói rằng:
Nếu chú thích Kế thừa không được chỉ định hoặc nếu không có loại kế thừa nào được chỉ định cho phân cấp lớp thực thể, thì chiến lược ánh xạ SINGLE_TABLE sẽ được sử dụng.
... và nếu bạn xem cách làm SINGLE_TABLE
hoạt động, không có gì ngạc nhiên khi nó không hiệu quả với bạn; nó mong đợi tất cả các lớp con nằm trong một bảng lớn với giá trị phân biệt kỳ diệu.
InheritanceType.TABLE_PER_CLASS
gần với cách Pg hoạt động hơn, nhưng tôi nghi ngờ rằng việc cấy ghép JPA sẽ hơi nhầm lẫn khi các bảng loại cơ sở có các mục nhập cho mỗi thực thể của một loại lá. Nó cố gắng làm những việc như UNION
truy vấn trên các bảng của lớp con khi truy vấn trên lớp cha và điều đó có thể tạo ra kết quả kỳ lạ - ít nhất là trùng lặp nếu UNION
được sử dụng và các vấn đề về hiệu suất nếu nó sử dụng UNION ALL
. Tùy thuộc vào chính xác cách nhà cung cấp thực hiện chiến lược, chiến lược có thể hoạt động ít nhất một phần. Bạn phải kiểm tra và kết quả có thể sẽ khá cụ thể cho từng nhà cung cấp.
Việc triển khai thực sự tốt hỗ trợ kế thừa PG cho JPA có thể sẽ yêu cầu các phần mở rộng của nhà cung cấp JPA cho một chiến lược kế thừa mới hiểu được phần mở rộng PostgreSQL để kế thừa và cho ONLY
truy vấn.
Nếu bạn có thể thuyết phục việc triển khai JPA của mình sử dụng SELECT ... FROM ONLY subclass_table
khi ở InheritanceType.TABLE_PER_CLASS
thì nó sẽ hoạt động OK với sự kế thừa PostgreSQL. Nó sẽ chỉ thấy các hàng không được kế thừa trong mỗi bảng và làm việc với chúng như thể chúng là các bảng bình thường. Sau đó, mã không phải JPA khác của bạn có thể tiếp tục sử dụng các tính năng kế thừa. Tôi đoán có thể bạn có thể sửa đổi mã phương ngữ PostgreSQL cho Hibernate để làm điều này, nhưng cá nhân tôi sẽ không đến đó trừ khi tôi hoàn toàn đã để làm cho JPA hỗ trợ lược đồ PostgreSQL hiện có dựa nhiều vào tính kế thừa.