在使用Hibernate 4插入Clob,Blob类型数据到mysql时,Hibernate报错,错误信息:
开始以为设置的参数有问题:
20M应该够了,我只是插了张900k左右的图片而已,Blob数据类型不是放很大的数据吗?
在谷歌之后,我发现我错了,可以看官方文档的说明。
BLOB[(M)]
最大长度为65,535(216–1)字节的BLOB列</span>。
可以给出该类型的可选长度M。如果给出,则MySQL将列创建为最小的但足以容纳M字节长的值的BLOB类型。
TEXT[(M)]
最大长度为65,535(216–1)字符的TEXT列。
可以给出可选长度M。则MySQL将列创建为最小的但足以容纳M字符长的值的TEXT类型。
MEDIUMBLOB
最大长度为16,777,215(224–1)字节的BLOB列。
MEDIUMTEXT
最大长度为16,777,215(224–1)字符的TEXT列。
LONGBLOB
最大长度为4,294,967,295或4GB(232–1)字节的BLOB列。</span>LONGBLOB列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。
LONGTEXT
最大长度为4,294,967,295或4GB(232–1)字符的TEXT列。LONGTEXT列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存
即Blob,Clob类型只能放65K的数据,longblob,longtext能放4G的数据。
因此,正确的方式是修改类型为longblob,或者插入65k以下的数据。
附录:
最初的建表sql为:
测试方法:
public void saveTest2() throws Exception {
Person person = new Person();
File file = new File("F:/saveFile/testhua.jpg");
FileInputStream fis = new FileInputStream(file);
File file1 = new File("f:/saveFile/my_log.log");
Reader reader = new FileReader(file1);
// 必须开启事务
Session session = HibernateUtil.openSession();
Transaction ts = session.beginTransaction();
person.setImage(session.getLobHelper().createBlob(fis, file.length()));
person.setIntro(session.getLobHelper().createClob(reader,
file1.length()));
ts.commit();
baseDao.saveObject(person);
}
工具类为:
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
Configuration cfg = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build();
sessionFactory = cfg.buildSessionFactory(serviceRegistry);
} catch (Throwable e) {
throw new ExceptionInInitializerError(e);
}
}
private HibernateUtil() {
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
/**
* 获取session对象
* @return
*/
public static Session openSession(){
return sessionFactory.getCurrentSession();
}
}