bayt için uygun uyku şerhi[]
Bir uygulama hazırda 3.1 ve JPA ek açıklamaları kullanarak var. Byte ile birkaç nesne var[] öznitelikleri (boyut 1 K - 200 k). Blob satıcı özellikleri yapmak gerektiği gibi) OLANLARI gizlemek gibi görünüyor @annotation ve Hazırda Beklet 3.1 Lob tüm büyük veritabanları üzerinde bu gayet iyi okuyabilir JPA kullanır.
@Entity
public class ConfigAttribute {
@Lob
public byte[] getValueBuffer() {
return m_valueBuffer;
}
}
Postgresql 3.5 breaks (and won't fix) bu açıklama kombinasyon (geçici çözüm) Hazırda Beklet o zaman fark ettik 3.5, yükseltmek zorunda kaldık. Şu ana kadar net bir düzeltme bulamadım, ama ben sadece @Lob kaldırırsanız, postgresql türü byte a * çalışır, ama isim sadece) kullandığı fark ettim.
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.
Bir yol için büyük veritabanları arasında taşınabilir olan tek açıklamalı bir sınıf (blob bir özellik) için arıyorum.
- Bir bayt dizisi için taşınabilir yoludur [ne] özelliği?
- Bu hazırda bazı son sürümünde giderilmiştir?
Güncelleme: this blog okuduktan sonra nihayet JİRA sorun orijinal çözüm olduğunu anladım ben: Anlaşılan @Lob ve drop özelliği olarak: açıklama gerekiyor
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
byte[] getValueBuffer() {...
Ancak, bu çalışmıyorbenim içinBen hala byte a * yerine OID; ancak oıd ister gibiydi kim JİRA sorun, yazar için çalışma yaptı.
A. Garcia cevap sonra, o zaman aslında, oracle, postgresql, ama çalışmıyor bu combo, çalıştı.
@Type(type="org.hibernate.type.BinaryType")
byte[] getValueBuffer() {...
Asıl yapmam gereken ne @org kontrol edilir.Hazırda Beklet.ek açıklamalar.Kombinasyonu (@Lob byte[] eşlenen alır) türü (postgresql).
Burada 3.5.5 gelen parçacık.MaterializedBlobType (sql tipi Blob) son. Steve'in blog göre, postgresql seni byte a * (nedenini sorma) ve OID için postgresql özel Blob türü için Dere kullanmak istiyor. SetBytes kullanmayı unutmayın() OLANLARI da byte a * (Geçmiş deneyim). Bu kullanımı-akışlar hiçbir etkisi yoktur açıklıyor. hem farzet ki"'. byte a *
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 );
}
}
Bu sonuçlar:
ERROR: column "signature" is of type oid but expression is of type bytea
Güncelleme Bir sonraki mantıklı soru, "neden sadece byte a * masa tanımları el ile değiştirmek" ve devam (@Lob byte[])? Buyokiş,KADARboş bayt depolamak için deneyin[]. PostgreSQL sürücüsü düşünüyor hangi OID tür bir ifade ve sütun türü bu çünkü Hazırda Beklet (haklı olarak) aramaları ise byte a * -- BULUNMAKTAYDI.() setNull gerekli OLANLARI yerine.sürücü PG olan setBytes(null) bekliyor.
ERROR: column "signature" is of type bytea but expression is of type oid
Hazırda şu anda bir 'çalışma sürüyor (3.5.5 admin yorum göre)'. 3.5.5 kod çok önerilmiyor yani aslında alt sınıflandırmaya, PostgreSQLDialect zaman bakmak için ne bilmek) için zor.
AFAKT, Türleri.BLOB/'' postgresql üzerinde OID tarzı OLANLARI (erişim kullanan bazı özel tür eşlenmesi (nesne ve MaterializedBlobType DEĞİL yani PostgresqlBlobType). oıd Aslında hiç başarıyla postgresql ile Lekeler kullandım, ama byte a * sadece beklerdim / olarak çalıştığını biliyorum.
Şu anda BatchUpdateException sürücü beton desteklemiyor onun mümkün -- bakıyorum.
2004'ten büyük bir alıntı: "Benim saçmalıkları özetle, yerli mal sürücüsü ile vurdu. düzgün Uyku değiştirmeden önce yapmak için beklememiz gerektiğini söyleyebilirim."
Referanslar:
- https://forum.hibernate.org/viewtopic.php?p=2393203
- https://forum.hibernate.org/viewtopic.php?p=2435174
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- http://opensource.atlassian.com/projects/hibernate/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/
CEVAP
Bir bayt dizisi için taşınabilir yoludur [ne] özelliği?
İstediğin şeye bağlı. JPA olmayan byte[]
açıklamalı devam edebilir. JPA 2.0 spec:
11.1.6 Temel Açıklama
Basic
ek açıklama en basit olanıdır veritabanı sütun eşleme türü.Basic
ek açıklama uygulanabilir kalıcı bir özellik için veya örnek aşağıdaki herhangi bir değişken tür: Java ilkel türleri, ambalaj kağıtları ilkel türleri,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[]
, çeteleler, ve diğer yazdığınızSerializable
uygular. Bölüm 2.8, kullanım anlatıldığı gibiBasic
ek açıklama isteğe bağlı. kalıcı alanlar ve özellikleri bu tür. Temel böyle bir açıklama için belirtilmemiş alan veya özellik, varsayılan değerler Temel açıklama geçerli olacaktır.
Ve Hazırda Beklet haritası "varsayılan" için bir SQL VARBINARY
(veya 33 ** bir SQL Column
boyutuna bağlı olarak?) bu PostgreSQL bytea
ile işler.
Ama eğer byte[]
Büyük bir Nesne içinde saklı olmak istiyorsanız, @Lob
kullanmalısınız. Spec:
11.1.24 Açıklama Lob
Lob
ek bir belirtir kalıcı özellik veya alan olmalıdır bir büyük nesne olarak devam etti veritabanı destekli büyük nesne türü. Taşınabilir uygulamalar kullanmalısınızLob
eşlemek açıklama veritabanıLob
yazın.Lob
ek açıklama birlikte kullanılabilir Temel açıklama veya ileElementCollection
açıklama ne zaman eleman koleksiyon değeri temel alır yazın.Lob
ikili veya olabilir karakter yazın.Lob
türüdür bu tür olayla ya özellik ve kalıcı alan string ve karakter türleri hariç Blob varsayılan.
Ve Hazırda PostgreSQL oid
ile işleyen 45* *bir SQL için harita olacak
.
Bu hazırda bazı son sürümünde giderilmiştir?
Peki, sorunun tam olarak ne olduğunu bilmiyorum. Ama en azından hiçbir şey 3.5 3.5.0 Beta-2 değişti geçilen)bu yana değişti diyebilirim.x şube.
Ama PostgreSQL and BLOBs HHH-4876, HHH-4617 gibi ve sorunlar (PostgreSQLDialect
javadoc sözü) benim anladığım şu özelliği ayarlamak gerekiyor
hibernate.jdbc.use_streams_for_binary=false
@Lob
oid
yani byte[]
VARBINARY
Oracle ile istediğin beri benim anlayış () kullanmak istiyorsanız. Bu denediniz mi?
Alternatif olarak, 67* *anlaşılacağı kullanarak PrimitiveByteArrayBlobType
eski davranış (ön Hazırda 3.5) almak için onaylanmadı.
Referanslar
- JPA 2.0
- Bölüm 2.8 "Olmayan İlişki Alanları veya Özellikleri Eşleme Varsayılan"
- Bölüm 11.1.6 "Temel Bir Açıklama"
- Bölüm 11.1.24 "Lob Ek Açıklama"
Oyun 2048 için en uygun algoritma nedi...
Bir kodlama kullanmadan bayt dizisi iç...
Uygun MIME türü için PDF medya dosyala...
Nasıl Onaltılık Dize ve Başkan versa i...
Bayt dönüştürmek için [nasıl] dize?...