在oracle中,用hibernate操作clob对象花了三天时间。终于把他弄对了。
前提:oracle中用一个clob字段。hbm.xml中对应的是java.sql.Clob/
<property
name="answer"
type="java.sql.Clob"
update="true"
insert="true"
column="answer"
/>
pojo中:
....... 其他属性
private java.sql.Clob;
public Clob getAnswer() {
return this.answer;
}
public void setAnswer(Clob answer) {
this.answer = answer;
}
.........其他方法
存储的时候用session.save(obj)的方法;
这样做 clob属性中数据少的时候没报错。但数据量大的时候就会抛莫名其妙的异常。
问题出在Oracce中Blob/Clob字段独特的访问方式,Oracle Blob/Clob字段本身拥有一个游标(cursor) , JDBC必须通过游标对Blob/ Clob字段进行操作,在Blob/Clob字段被创建之前,我们无法获取其游标句柄,这也就意味着,我们必须首先创建一个空Blob/Clob字段,再从这个空Blob/Clob字段获取游标,写入我们所期望保存的数据。
至于如何操作可参考本博客其他文章(转载的)。
这里主要讲述两个异常
(1) java.lang.ClassCastException : org.hibernate.lob.clobImpl 转型异常
原因:用hibernateTemplate.save(),或者session.save()保存完对象后发现其对象的类型是clobImpl的。
此时强制转化就会报错。
解决方法:要用session.refresh()方法。也就是说refresh()方法必须在取clob对象之前。
(2) ORA-01002: 读取违反顺序
原因:在refresh方法的时候导致的
解决方法:用session开始一个事务。然后就最后末事务在提交。(至于为什么,我也不清楚)
上述主要涉及的是hibernate存储clob,若直接用jdbc同样注意两个错误。
(1)ORA-01002: 读取违反顺序
同上原理。设置connection 自动提交为false,
conn.setAutoCommit(false);
(2)ORA-22920: 未锁定含有 LOB 值的行
在select 时候 要加上 “for update ”
例子:
Connection conn = getConnection();
conn.setAutoCommit(false);
PreparedStatement p=conn.prepareStatement("select * from train_test where id='"+po.getId()+"' for update");
ResultSet rs = p.executeQuery();
rs.next();
CLOB testDesc= (CLOB) rs.getClob("test_desc");
CLOB answer= (CLOB) rs.getClob("answer");
testDesc.putString(1, getValue(ret,"试题题目"));
answer.putString(1, getValue(ret,"试题答案"));
p=conn.prepareStatement("update train_test set test_desc=? ,answer=?");
p.setClob(1, testDesc);
p.setClob(2, answer);
p.executeUpdate();
conn.commit();
写完,收工。
分享到:
相关推荐
以上就是关于在Hibernate中保存Blob和Clob对象的基本操作。在实际项目中,还需要考虑性能优化、错误处理等问题,例如使用流式处理减少内存占用,以及适当地配置Hibernate的缓存策略等。了解并熟练掌握这些技巧,能...
在Java的持久化框架Hibernate中,BLOB(Binary Large Object)和CLOB(Character Large Object)是用来处理大数据类型的,如图像、音频、大型文本等。本文将深入探讨Hibernate如何进行BLOB和CLOB的操作,以及相关的...
- 插入数据:在保存实体时,Hibernate会自动处理Clob和Blob对象的序列化。可以通过`getClob()`和`setClob()`方法设置和获取Clob值,对于Blob,使用`getBlob()`和`setBlob()`。 - 更新数据:同样,更新实体时,...
例如,当你调用`session.saveOrUpdate(entity)`或`entityManager.persist(entity)`时,Hibernate会将Clob和Blob的内容正确地保存到数据库中。 当从数据库中检索这些字段时,同样可以通过Hibernate的API获取。例如,...
在保存数据时,Blob可以接收FileInputStream或byte[]作为参数,Clob则接受String: ```java // 对于Blob byte[] imageData = ...; // 从文件或网络获取 session.saveOrUpdate(entity); entity.setBinaryData(new ...
hibernate Blob、Clob字段的映射的例子.数据库mysql,数据库放在文件夹里面,例子的说明文章在我的csdn blog: http://blog.csdn.net/zhengcandan
这篇文章主要讲解了如何使用`JDBC`和`Hibernate`这两种不同的方式来处理`CLOB`和`BLOB`字段。 1. **数据库中的`CLOB`与`BLOB`类型** - 在MySQL中,`CLOB`对应`TEXT`类型,`BLOB`对应`BLOB`类型。 - 在DB2或Oracle...
### Spring与Hibernate处理大字段(CLOB/BLOB) 在企业级应用开发中,经常会遇到需要存储大量文本或二进制数据的情况,这时就需要用到数据库的大字段类型如CLOB(Character Large Object)和BLOB(Binary Large ...
无论是Hibernate还是JDBC,获取到Blob的输入流后,你可能需要将其保存到本地文件或者进行其他处理。这涉及到文件流的读写操作: ```java FileOutputStream outputStream = new FileOutputStream("outputFilePath");...
四、处理 Clob 和 Blob 类型的常见问题 在处理 Clob 和 Blob 类型时,常见的问题包括: * 配置错误:如果配置错误,可能会导致数据读取或写入失败。 * 数据太大:如果数据太大,可能会导致内存溢出或性能问题。 * ...
此外,还要注意数据库的性能,比如使用BLOB而非CLOB,根据数据的性质选择更合适的存储方式。 总的来说,理解和掌握Clob在Hibernate中的应用对于开发处理大文本数据的系统至关重要。通过合理的配置和使用,可以有效...
在实际操作中,可以通过Hibernate实现Oracle数据库中BLOB数据的存储和删除操作,然后利用Struts2框架展示这些BLOB数据。这样的结合,不仅可以提高开发效率,还能保证应用的性能和稳定性。 ### 实际操作步骤 在实际...
- 使用Blob/Clob接口:直接操作Clob接口进行读写,而不是将其转换为字符串或其他数据类型,以减少转换开销。 通过以上内容,你应该对在Hibernate中动态映射Oracle 10g的CLOB类型有了深入理解,这将帮助你在实际...
在Hibernate,一个流行的Java对象关系映射(ORM)框架中,Blob和Clob也被广泛使用,特别是在处理大型图片、文件或长文本时。 在Hibernate和Microsoft SQL Server的环境中,Blob常用来存储图像、音频、视频等二进制...
一个完整的工程,主要功能为:spring+hbernate对clob、blob字段的处理 包括:数据脚本、典型的SSH框架处理,以及spring、hibernate数据批量保存等功能源码、所用到的lib包 数据环境为:oracle 10G 开发:Mycelipse5.1...
在Spring配置文件中,你需要创建一个`SessionFactory` bean,同时指定一个`lobHandler`属性,用于处理CLOB和BLOB类型的数据。这确保了Spring和Hibernate能够正确地与Oracle数据库交互处理大对象。 ```xml ...