Hazırda bekletme 3.1 ve JPA açıklamalarını kullanan bir uygulamam var. Bayt [] özniteliklerine (1k - 200k boyutunda) sahip birkaç nesneye sahiptir. JPA @Lob açıklamasını kullanır ve hazırda bekletme 3.1, tüm büyük veritabanlarında bunları gayet iyi okuyabilir - JDBC Blob satıcı özelliklerini gizler gibi görünüyor (yapması gerektiği gibi).
@Entity
public class ConfigAttribute {
@Lob
public byte[] getValueBuffer() {
return m_valueBuffer;
}
}
Postgresql'de (geçici çözüm olmadan ) bu ek açıklama kombinasyonunu 3.5 kesintiyi hazırda beklettiğimizi (ve düzeltmeyeceğini) keşfettiğimizde 3.5'e yükseltmek zorunda kaldık . Şimdiye kadar net bir düzeltme bulamadım, ancak @Lob'u kaldırırsam postgresql türü baytını kullandığını fark ettim (bu işe yarıyor, ancak yalnızca postgreslerde).
annotation postgres oracle works on
-------------------------------------------------------------
byte[] + @Lob oid blob oracle
byte[] bytea raw(255) postgresql
byte[] + @Type(PBA) oid blob oracle
byte[] + @Type(BT) bytea blob postgresql
once you use @Type, @Lob seems to not be relevant
note: oracle seems to have deprecated the "raw" type since 8i.
Büyük veritabanları arasında taşınabilir olan tek bir açıklamalı sınıfa (blob özelliği ile) sahip olmanın bir yolunu arıyorum.
- Bir bayt [] özelliğine ek açıklama eklemenin taşınabilir yolu nedir?
- Bu, hazırda bekletme modunun bazı yeni sürümlerinde düzeltildi mi?
Güncelleme: Bu blogu okuduktan sonra nihayet JIRA sorunundaki orijinal çözümün ne olduğunu anladım: Görünüşe göre @Lob'u bırakmanız ve mülke şu şekilde açıklama eklemeniz gerekiyor:
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
byte[] getValueBuffer() {...
Ancak bu benim için çalışmıyor - yine de bayt yerine OID'ler alıyorum; Ancak oid istiyor gibi görünen JIRA sayısının yazarı için işe yaradı.
A. Garcia'nın cevabından sonra, postgresql üzerinde çalışan ama oracle üzerinde çalışmayan bu kombinasyonu denedim.
@Type(type="org.hibernate.type.BinaryType")
byte[] getValueBuffer() {...
Gerçekten yapmam gereken, hangi @ org.hibernate.annotations.Type kombinasyonunu (@Lob + bayt [] eşlenir) (postgresql üzerinde) olarak kontrol etmektir.
MaterializedBlobType (sql type Blob) 'dan 3.5.5.Final'den gelen snippet. Steve'in bloguna göre postgresql, Akışları bayt için (nedenini sorma) ve oids için postgresql'in özel Blob türünü kullanmanızı istiyor. JDBC üzerinde setBytes () kullanmanın da bayt için olduğunu unutmayın (geçmiş deneyimlerden). Dolayısıyla bu, kullanım akışlarının neden her ikisinin de 'bayt' olduğunu varsaydığı bir etkisinin olmadığını açıklıyor.
public void set(PreparedStatement st, Object value, int index) {
byte[] internalValue = toInternalFormat( value );
if ( Environment.useStreamsForBinary() ) {
// use streams = true
st.setBinaryStream( index,
new ByteArrayInputStream( internalValue ), internalValue.length );
}
else {
// use streams = false
st.setBytes( index, internalValue );
}
}
Bunun sonucu:
ERROR: column "signature" is of type oid but expression is of type bytea
Güncelleme Bir sonraki mantıksal soru şudur: "neden tablo tanımlarını manuel olarak bayt olarak değiştirip (@Lob + bayt []) tutmuyoruz? Bu does , işi KADAR sen [] boş byte depolamak deneyin. PostgreSQL sürücüsünün bir OID türü ifade olduğunu düşündüğü ve sütun türü bayttır - bunun nedeni, PG sürücüsünün beklediği JDBC.setBytes (null) yerine hibernate'in (haklı olarak) JDBC.setNull () işlevini çağırmasıdır.
ERROR: column "signature" is of type bytea but expression is of type oid
Hazırda bekletme modundaki tür sistemi şu anda 'devam eden bir çalışma'dır (3.5.5 kullanımdan kaldırma açıklamasına göre). Aslında 3.5.5 kodunun büyük bir kısmı kullanımdan kaldırılmıştır, PostgreSQLDialect'i alt sınıflara ayırırken neye bakılması gerektiğini bilmek zordur).
AFAKT, Types.BLOB / postgresql üzerindeki 'oid', OID tarzı JDBC erişimini kullanan bazı özel türlerle eşlenmelidir (yani PostgresqlBlobType nesnesi ve NOT MaterializedBlobType). Postgresql ile Blobları asla başarılı bir şekilde kullanmadım, ancak bayt'ın sadece beklediğim gibi çalıştığını biliyorum.
Şu anda BatchUpdateException'a bakıyorum - sürücünün gruplamayı desteklememesi olası.
2004'ten harika bir alıntı: "Saçmalıklarımı özetlemek gerekirse, Hibernate'i değiştirmeden önce JDBC sürücüsünün LOB'ları düzgün bir şekilde yapmasını beklememiz gerektiğini söyleyebilirim."
Referanslar:
- https://forum.hibernate.org/viewtopic.php?p=2393203
- https://forum.hibernate.org/viewtopic.php?p=2435174
- http://hibernate.atlassian.net/browse/HHH-4617
- http://postgresql.1045698.n5.nabble.com/Migration-to-Hibernate-3-5-final-td2175339.html
- https://jira.springframework.org/browse/SPR-2318
- https://forums.hibernate.org/viewtopic.php?p=2203382&sid=b526a17d9cf60a80f13d40cf8082aafd
- http://virgo47.wordpress.com/2008/06/13/jpa-postgresql-and-bytea-vs-oid-type/