关于Hibernate处理blob类型要注意的问题
今天使用Hibernate插入一个图片时候总是报这个错误:
Data truncation: Data too long for column 'photo' at row 1
先说一下错误的原因吧。
这个photo 我是这么定义的:private byte[] photo; 因为我在hibernate.cfg.xml中配置了
<property name="hibernate.hbm2ddl.auto">update</property> 所以可以自动生成表结构。
而错就错在这个表结构的photo列有问题。
看下图:
生成的是blob 类型。
而MySQL的文档是这么解释的:
BLOB[(M)]
最大长度为65,535(216–1)字节的BLOB列。
可以给出该类型的可选长度M。如果给出,则MySQL将列创建为最小的但足以容纳M字节长的值的BLOB类型。
而我插入的图片大小大于了这个范围,所以总是插入不进去。
解决办法:
将blob改为longblob。关于longblob类型MySQL是这么解释的:
LONGBLOB
最大长度为4,294,967,295或4GB(232–1)字节的BLOB列。LONGBLOB列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。
果然,换成longblob就好了。
经验总结:有时候使用Hibenrate自动生成的表结构,可能跟实际需求有差别。所以,通过Hibernate自动生成后的表结构一定要亲自检查一下,一定要满足你的具体的实际需求才好啊。
总之:一切从实际出发!
附:测试代码
Java代码
@Test
public void testSave() throws Exception {
InputStream in = new FileInputStream("src/cat.jpg");
byte[] photo = new byte[in.available()];
System.out.println(in.available()); //81108
in.read(photo);
in.close();
User user = new User();
user.setBirthday(new Date());
user.setDesc("描述....");
user.setGender(User.GENDER_FEMALE);
user.setName("monday");
user.setPhoto(photo);
user.setResume("自我介绍...");
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();
session.close();
}
作者“自由一方”
补充:软件开发 , Java ,