Apa cara portabel untuk membubuhi keterangan properti byte[]?
Itu tergantung pada apa yang Anda inginkan. JPA dapat mempertahankan byte[] yang tidak beranotasi . Dari spesifikasi JPA 2.0:
11.1.6 Anotasi Dasar
Basicanotasi adalah jenis pemetaan paling sederhana ke kolom database.Basicanotasi dapat diterapkan ke properti persisten atau variabel instan dari salah satu tipe berikut:Java primitif, tipe, pembungkus tipe primitif,java.lang.String,java.math.BigInteger,java.math.BigDecimal,java.util.Date,java.util.Calendar,java.sql.Date,java.sql.Time,java.sql.Timestamp,byte[],Byte[],char[],Character[], enums, dan semua tipe lain yang mengimplementasikanSerializable.Seperti yang dijelaskan dalam Bagian 2.8, penggunaanBasicanotasi adalah opsional untuk bidang dan properti persisten dari jenis ini. Jika Anotasi Dasar tidak ditentukan untuk bidang atau properti tersebut, nilai default anotasi Dasar akan berlaku.
Dan Hibernate akan memetakannya "secara default" ke VARBINARY SQL (atau SQL LONGVARBINARY tergantung pada Column size?) yang ditangani PostgreSQL dengan bytea .
Tetapi jika Anda menginginkan byte[] untuk disimpan dalam Objek Besar, Anda harus menggunakan @Lob . Dari spesifikasi:
11.1.24 Anotasi Lob
Sebuah
Lobanotasi menetapkan bahwa properti atau bidang persisten harus dipertahankan sebagai objek besar ke jenis objek besar yang didukung basis data. Aplikasi portabel harus menggunakanLobanotasi saat memetakan ke basis dataLobTipe.Lobanotasidapat digunakan bersama dengan anotasi Dasar atau denganElementCollectionanotasi ketika nilai koleksi elemen adalah tipe dasar. SebuahLobdapat berupa tipe orcharacter biner.Lobtype disimpulkan dari jenis bidang atau properti yang persisten dan, kecuali untuk tipe string dan karakter, defaultnya adalah Blob.
Dan Hibernate akan memetakannya ke BLOB SQL yang ditangani PostgreSQL dengan oid .
Apakah ini diperbaiki di beberapa versi hibernasi terbaru?
Nah, masalahnya saya tidak tahu persis apa masalahnya. Tapi setidaknya saya bisa mengatakan bahwa tidak ada yang berubah sejak 3.5.0-Beta-2 (di mana perubahan telah diperkenalkan) di cabang 3.5.x.
Tetapi pemahaman saya tentang masalah seperti HHH-4876, HHH-4617 dan PostgreSQL dan BLOB (disebutkan dalam javadoc dari PostgreSQLDialect ) adalah bahwa Anda seharusnya mengatur properti berikut
hibernate.jdbc.use_streams_for_binary=false
jika Anda ingin menggunakan oid yaitu byte[] dengan @Lob (yang merupakan pemahaman saya sejak VARBINARY bukan yang Anda inginkan dengan Oracle). Apakah Anda mencoba ini?
Sebagai alternatif, HHH-4876 menyarankan penggunaan PrimitiveByteArrayBlobType yang tidak digunakan lagi untuk mendapatkan perilaku lama (sebelum Hibernate 3.5).
Referensi
- Spesifikasi JPA 2.0
- Bagian 2.8 "Default Pemetaan untuk Bidang atau Properti Non-Hubungan"
- Bagian 11.1.6 "Anotasi Dasar"
- Bagian 11.1.24 "Anotasi Lob"
Sumber daya
- https://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- https://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- https://relation.to/Bloggers/PostgreSQLAndBLOBs