JPA,Mysql Blob返回的数据太长了
我在我的实体中有一些byte[]
字段,例如:
@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
– 我错过了什么?
这一切都取决于用于picture
列的列types。 根据您的需要,使用:
-
TINYBLOB
:最大长度为255个字节 -
BLOB
:最大长度为65,535字节 -
MEDIUMBLOB
:最大长度为MEDIUMBLOB
字节 -
LONGBLOB
:最大长度为4,294,967,295字节
请注意,如果您从JPA批注中生成表,则可以通过指定Column
的length
属性来“控制”MySQL将使用的types,例如:
@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`
在我们的例子中,我们不得不使用下面的语法:
public class CcpArchive { ... private byte[] ccpImage; ... @Lob @Column(nullable = false, name = "CCP_IMAGE", columnDefinition="BINARY(500000)") public byte[] getCcpImage() { return ccpImage; } ... }