2010-08-17 21 views
45

我在我的實體有一些byte[]領域,例如:JPA,Mysql的斑點返回數據太長

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

在字段設置爲BLOB所以這應該是罰款我的數據庫架構。總之:每次當我嘗試插入圖片或PDF - 無非1mb大,我只收到此

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) 

我檢查了我的MySQL CNF和max_allowed參數是設置爲16M - 我這麼想嗎?

+0

通過此鏈接解決http://enricogi.blogspot.com/2008/12/blob-type-in​​-mysql.html - 簡而言之 - MySQL Blob的最大尺寸爲64k – onigunn 2010-08-17 15:19:16

回答

99

這一切都取決於用於picture列的列類型。根據您的需求,請使用:

  • TINYBLOB:255個字節
  • BLOB最大長度:65535個字節
  • MEDIUMBLOB最大長度:16,777,215字節
  • LONGBLOB最大長度的4,294,967,295最大長度字節

請注意,如果您從JPA註釋中生成表,則可以「控制」MySQL的類型wi通過指定Columnlength屬性,例如將使用:

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

根據length,你會得到:

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

Perf等答案,謝謝。 – 2013-12-13 09:46:13

1

在這裏,我們不得不使用的語法如下:

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