PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Warisan PostgreSQL dengan JPA, Hibernate

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLAlchemy func.count pada kolom boolean

  2. Apa yang Baru di PgBouncer 1.6

  3. postgresql - hitung (tidak ada nilai nol) dari setiap kolom dalam tabel

  4. Kesalahan SYSCALL SSL Postgres:EOF terdeteksi dengan python dan psycopg

  5. Pembuatan urutan berurutan