今天使用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自动生成后的表结构一定要亲自检查一下,一定要满足你的具体的实际需求才好啊。
总之:一切从实际出发!
附:测试代码
@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 应用开发中,尤其是使用 ORM 框架如 Hibernate 进行持久化层开发时,如何高效地处理 BLOB 类型字段成为了一个关键问题。 本文档将详细介绍如何使用 Hibernate 对 Blob 类型字段进行数据添加的过程,并通过...
在Java的持久化框架Hibernate中,Blob类型常用于存储大对象(Large Object),如图片、音频、视频或大型文本文件等。本篇文章将深入探讨如何使用Hibernate读取数据库中的Blob字段,以及涉及到的相关知识点。 首先,...
在Oracle数据库中,BLOB类型的字段具有特殊的处理方式,尤其在使用JDBC(Java Database Connectivity)和Hibernate框架时,需要特别注意其写入过程。以下是对“JDBC+Hibernate将Blob数据写入Oracle”这一主题的深入...
在使用Hibernate操作BLOB和CLOB时,需要注意一些潜在的问题,比如内存管理,因为大数据对象可能会占用大量内存。另外,对于大文件的读写,可能需要分块处理,避免一次性加载整个文件到内存。同时,确保数据库支持...
在实际项目中,还需要考虑性能优化、错误处理等问题,例如使用流式处理减少内存占用,以及适当地配置Hibernate的缓存策略等。了解并熟练掌握这些技巧,能帮助我们在处理大数据类型时更加高效和稳定。
处理Blob数据时,应考虑到性能问题。大Blob对象可能导致内存压力,因此在读取时,推荐使用流式处理而不是一次性加载整个Blob到内存。同时,注意关闭所有打开的流以避免资源泄漏。 综上所述,使用Hibernate和JDBC...
总之,Hibernate通过提供对Blob和Clob的直接支持,使得在Java Web应用中处理大数据类型变得相对简单。正确理解和使用这些特性,可以有效地管理数据库中的大对象数据,提高应用的灵活性和可维护性。
四、处理 Clob 和 Blob 类型的常见问题 在处理 Clob 和 Blob 类型时,常见的问题包括: * 配置错误:如果配置错误,可能会导致数据读取或写入失败。 * 数据太大:如果数据太大,可能会导致内存溢出或性能问题。 * ...
在使用Hibernate时,处理BLOB字段的过程会有所不同,因为Hibernate提供了一种更面向对象的方式来操作数据库。你可能需要定义一个实体类,包含BLOB类型的属性,并使用Hibernate的Session接口来保存或更新对象。例如:...
在Java的持久化框架Hibernate中,处理大数据类型如Clob(Character Large Object)和Blob(Binary Large Object)是常见的需求,这些数据类型通常用于存储大量的文本或二进制数据。Oracle数据库提供了支持Clob和Blob...
无论选择哪种方式,确保正确处理Blob数据的输入输出流以及关闭资源是至关重要的,以避免内存泄漏或资源占用过多的问题。在实际开发中,还应该考虑异常处理和事务管理,以确保数据的一致性和安全性。
在Java的持久化框架Hibernate中,BLOB(Binary Large Object)数据类型被用来...总之,Hibernate提供了方便的机制来处理BLOB数据类型,但同时也需要开发者在处理大数据时注意性能和资源管理,以确保应用的稳定和高效。
在写入时,先将字符串转换为Clob对象,再由Hibernate处理;读取时,将Clob内容转化为字符串。这种方式适用于数据量不是特别大的情况,因为所有数据都需要在内存中进行转换。 3. **直接使用Clob类型**: Hibernate...
Hibernate则作为持久层框架,处理数据库操作;而Spring作为服务层和依赖注入框架,提供事务管理和其他服务,同时也支持AOP(面向切面编程)。 在这个项目中,Blob数据类型被用于存储非结构化的二进制大对象,比如...
5. **使用Hibernate处理`CLOB`和`BLOB`** - Hibernate提供了更高级的抽象,使得处理大对象更加方便。在配置文件中,可以将`CLOB`映射为`clob`,`BLOB`映射为`binary`。 - 例如,在Hibernate的实体类中,可以这样...
5. **性能优化**:处理CLOB时,需注意性能问题。例如,频繁读写CLOB可能导致性能下降,因此在设计系统时要考虑读写频率和数据量。 6. **示例代码**:在Hibernate中,读取和写入CLOB的代码可能如下: ```java // ...
JDBC实现对CLOB和BLOB数据类型的操作 在数据库中,存在两种类型的数据:CLOB(Character Large OBject)和BLOB(Binary Large OBject),它们用于存储大型数据,如文本、图片、音频、视频等。对CLOB和BLOB数据类型...