2010-08-17 14 views
45

Benim varlığımda bazı byte[] alanları var, örneğin:JPA, Mysql Blob çok uzun veri döndürüyor

@Entity 
public class ServicePicture implements Serializable { 
    private static final long serialVersionUID = 2877629751219730559L; 
    // seam-gen attributes (you should probably edit these) 
    @Id 
    @GeneratedValue 
    private Long id; 
    private String description; 

    @Lob 
    @Basic(fetch = FetchType.LAZY) 
    private byte[] picture; 

Veritabanım şemada alan BLOB olarak ayarlanmış, bu yüzden bu işlem iyi olmalıdır. Her neyse: Bir resim veya pdf eklemeye çalıştığımda her zaman - 1mb'den büyük bir şey değil, sadece bu

16:52:27,327 WARN [JDBCExceptionReporter] SQL Error: 0, SQLState: 22001 
16:52:27,327 ERROR [JDBCExceptionReporter] Data truncation: Data too long for column 'picture' at row 1 
16:52:27,328 ERROR [STDERR] javax.persistence.PersistenceException: org.hibernate.exception.DataException: could not insert: [de.ac.dmg.productfinder.entity.ServicePicture] 
16:52:27,328 ERROR [STDERR]  at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:629) 
16:52:27,328 ERROR [STDERR]  at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:218) 
16:52:27,328 ERROR [STDERR]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
16:52:27,328 ERROR [STDERR]  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
16:52:27,328 ERROR [STDERR]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
16:52:27,328 ERROR [STDERR]  at java.lang.reflect.Method.invoke(Unknown Source) 
16:52:27,328 ERROR [STDERR]  at org.jboss.seam.persistence.EntityManagerInvocationHandler.invoke(EntityManagerInvocationHandler.java:46) 
16:52:27,328 ERROR [STDERR]  at $Proxy142.persist(Unknown Source) 

aldığımı hatırlıyorum MySQL cnf'yi kontrol ettim ve max_allowed param 16M olarak ayarlandı - bir şey özledim mi?

+0

bu linke http://enricogi.blogspot.com/2008/12/blob-type-in-mysql.html bunu çözüldü - kısacası - MySQL Blob sahiptir 64k – onigunn

cevap

99

Bu, picture sütununda kullanılan sütun türüne bağlıdır. İhtiyaçlarınıza bağlı olarak, bir kullanın:

  • TINYBLOB: 255 bayt
  • BLOB
  • maksimum uzunluğu: 65.535 bayt
  • MEDIUMBLOB
  • maksimum uzunluğu: 16777215 bayt
  • LONGBLOB maksimum uzunluğu: 4,294,967,295 maksimum uzunluğu bayt

Tablonuzu JPA ek açıklamalarından oluşturuyorsanız, MySQL türünü "denetleyebilirsiniz". örneğin, Column ait length niteliğini belirterek ll kullanım:

@Lob @Basic(fetch = FetchType.LAZY) 
@Column(length=100000) 
private byte[] picture; 

length bağlı olarak, elde edersiniz: Bizim durumumuzda

 0 < length <=  255 --> `TINYBLOB` 
    255 < length <= 65535 --> `BLOB` 
    65535 < length <= 16777215 --> `MEDIUMBLOB` 
16777215 < length <= 2³¹-1 --> `LONGBLOB` 
+0

Perf maksimum boyutu ect cevap, teşekkürler. –

1

aşağıdaki sözdizimini kullanmak zorunda kaldı:

public class CcpArchive 
{ 
    ... 
    private byte[] ccpImage; 
    ... 
    @Lob 
    @Column(nullable = false, name = "CCP_IMAGE", columnDefinition="BINARY(500000)") 
    public byte[] getCcpImage() 
    { 
     return ccpImage; 
    } 
    ... 
}