2010-08-17 53 views
45

tôi đã có một số lĩnh vực byte[] vào đơn vị của tôi, ví dụ .:JPA, Mysql Blob trả về dữ liệu quá dài

@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; 

Mở CSDL của tôi lĩnh vực này được thiết lập để BLOB vì vậy đây nên được tốt. Dù sao: Mỗi khi tôi cố gắng để chèn một hình ảnh hoặc pdf - không có gì lớn hơn 1mb, tôi chỉ nhận được này

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) 

Tôi đã kiểm tra MySQL CNF của tôi và max_allowed param được thiết lập để 16M - một cái gì đó tôi bị mất?

+0

Giải quyết bằng liên kết này http://enricogi.blogspot.com/2008/12/blob-type-in-mysql.html - viết tắt - MySQL Blob có kích thước tối đa là 64k – onigunn

Trả lời

99

Tất cả phụ thuộc vào loại cột được sử dụng cho cột picture. Tùy thuộc vào nhu cầu của bạn, sử dụng một:

  • TINYBLOB: chiều dài tối đa 255 byte
  • BLOB: chiều dài tối đa 65.535 byte
  • MEDIUMBLOB: chiều dài tối đa 16.777.215 byte
  • LONGBLOB: chiều dài tối đa của 4294967295 bytes

Lưu ý rằng nếu bạn tạo bảng từ chú thích JPA, bạn có thể "kiểm soát" loại MySQL wi sử dụng ll bằng cách xác định length thuộc tính của Column, ví dụ:

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

Tùy thuộc vào length, bạn sẽ nhận được:

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

Perf ect trả lời, cảm ơn. –

1

Trong trường hợp của chúng tôi, chúng tôi đã phải sử dụng cú pháp sau:

public class CcpArchive 
{ 
    ... 
    private byte[] ccpImage; 
    ... 
    @Lob 
    @Column(nullable = false, name = "CCP_IMAGE", columnDefinition="BINARY(500000)") 
    public byte[] getCcpImage() 
    { 
     return ccpImage; 
    } 
    ... 
} 
Các vấn đề liên quan