SORU
9 EYLÜL 2010, PERŞEMBE


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:

CEVAP
17 EYLÜL 2010, Cuma


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ız Serializableuygular. Bölüm 2.8, kullanım anlatıldığı gibi Basic 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ız Lob eşlemek açıklama veritabanı Lob yazın. Lob ek açıklama birlikte kullanılabilir Temel açıklama veya ile ElementCollection 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 oidile 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"

Kaynaklar

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • schmittastic

    schmittastic

    9 EYLÜL 2009
  • Sean Murphy

    Sean Murphy

    4 ŞUBAT 2009
  • Tom Megalis

    Tom Megalis

    18 NİSAN 2006