当前位置:编程学习 > JAVA >>

关于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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,