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
Basic
anotasi adalah jenis pemetaan paling sederhana ke kolom database.Basic
anotasi 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, penggunaanBasic
anotasi 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
Lob
anotasi menetapkan bahwa properti atau bidang persisten harus dipertahankan sebagai objek besar ke jenis objek besar yang didukung basis data. Aplikasi portabel harus menggunakanLob
anotasi saat memetakan ke basis dataLob
Tipe.Lob
anotasidapat digunakan bersama dengan anotasi Dasar atau denganElementCollection
anotasi ketika nilai koleksi elemen adalah tipe dasar. SebuahLob
dapat berupa tipe orcharacter biner.Lob
type 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
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- http://relation.to/Bloggers/PostgreSQLAndBLOBs