Konsep pewarisan JPA didasarkan pada tabel biasa. Itu tidak benar-benar "mendapatkan" gagasan tentang pewarisan tabel PostgreSQL. Itulah salah satu biaya bekerja dengan spesifikasi yang dirancang untuk mengekspos denominator umum terendah dari fitur dan melakukannya dengan mudah.
Lihat panduan ini untuk ringkasan yang layak tentang strategi pewarisan JPA. Perhatikan bahwa di Java 6 JavaDoc yang lebih baru untuk @Inheritance ada catatan yang mengatakan bahwa:
Jika anotasi Warisan tidak ditentukan atau jika tidak ada tipe pewarisan yang ditentukan untuk hierarki kelas entitas, strategi pemetaan SINGLE_TABLE akan digunakan.
... dan jika Anda melihat bagaimana SINGLE_TABLE
bekerja, tidak mengherankan itu tidak bekerja untuk Anda; itu mengharapkan semua subclass berada di satu meja besar dengan nilai diskriminator ajaib.
InheritanceType.TABLE_PER_CLASS
lebih dekat dengan bagaimana Pg berperilaku, tetapi saya menduga bahwa impl JPA akan menjadi sedikit bingung ketika tabel tipe dasar memiliki entri untuk setiap entitas tipe daun. Ia mencoba melakukan hal-hal seperti UNION
kueri di seluruh tabel subkelas saat melakukan kueri pada superkelas, dan itu bisa menghasilkan hasil yang aneh - setidaknya duplikasi jika UNION
digunakan dan masalah kinerja jika menggunakan UNION ALL
. Bergantung pada bagaimana tepatnya penyedia mengimplementasikan strategi, itu mungkin berhasil setidaknya sebagian. Anda harus menguji, dan hasilnya mungkin cukup spesifik untuk penyedia.
Implementasi yang sangat baik dari dukungan pewarisan PG untuk JPA mungkin akan memerlukan ekstensi penyedia JPA untuk strategi pewarisan baru yang memahami ekstensi PostgreSQL untuk pewarisan dan untuk ONLY
kueri.
Jika Anda dapat meyakinkan implementasi JPA Anda untuk menggunakan SELECT ... FROM ONLY subclass_table
saat berada di InheritanceType.TABLE_PER_CLASS
mode maka harus saling beroperasi OK dengan warisan PostgreSQL. Itu hanya akan melihat baris yang tidak diwarisi di setiap tabel dan bekerja dengannya seolah-olah itu adalah tabel biasa. Kode non-JPA Anda yang lain dapat tetap menggunakan fitur pewarisan. Saya kira mungkin Anda dapat memodifikasi kode dialek PostgreSQL untuk Hibernate untuk melakukan ini, tetapi secara pribadi saya tidak akan pergi ke sana kecuali saya benar-benar telah untuk membuat JPA mendukung skema PostgreSQL yang sudah ada yang sangat bergantung pada pewarisan.