<p> </p>
<p>前提:oracle中用一个clob字段。hbm.xml中对应的是java.sql.Clob/ </p>
<p>?</p>
<p>?</p>
<pre name="code" class="java"> <property
name="answer"
type="java.sql.Clob"
update="true"
insert="true"
column="answer"
/></pre>
<p>?</p>
<p>?</p>
<p>pojo中:</p>
<p>???? </p>
<pre name="code" class="java"> ....... 其他属性
private java.sql.Clob;
public Clob getAnswer() {
return this.answer;
}
public void setAnswer(Clob answer) {
this.answer = answer;
}
.........其他方法</pre>
<p>?</p>
<p>存储的时候用session.save(obj)的方法;</p>
<p>这样做 clob属性中数据少的时候没报错。但数据量大的时候就会抛莫名其妙的异常。</p>
<p>问题出在Oracce中Blob/Clob字段独特的访问方式,Oracle Blob/Clob字段本身拥有一个游标(cursor) , JDBC必须通过游标对Blob/ Clob字段进行操作,在Blob/Clob字段被创建之前,我们无法获取其游标句柄,这也就意味着,我们必须首先创建一个空Blob/Clob字段,再从这个空Blob/Clob字段获取游标,写入我们所期望保存的数据。</p>
<p>至于如何操作可参考本博客其他文章(转载的)。</p>
<p>?</p>
<p>这里主要讲述两个异常 </p>
<p>?</p>
<p>(1) java.lang.ClassCastException : org.hibernate.lob.clobImpl 转型异常</p>
<p>?? 原因:用hibernateTemplate.save(),或者session.save()保存完对象后发现其对象的类型是clobImpl的。</p>
<p>?? 此时强制转化就会报错。</p>
<p>???解决方法:要用session.refresh()方法。也就是说refresh()方法必须在取clob对象之前。</p>
<p>?(2) ORA-01002: 读取违反顺序</p>
<p>? 原因:在refresh方法的时候导致的</p>
<p>? 解决方法:用session开始一个事务。然后就最后末事务在提交。(至于为什么,我也不清楚)</p>
<p>?</p>
<p>上述主要涉及的是hibernate存储clob,若直接用jdbc同样注意两个错误。</p>
<p>(1)ORA-01002: 读取违反顺序</p>
<p>?同上原理。设置connection 自动提交为false,</p>
<p>???????????? ?? conn.setAutoCommit(false);</p>
<p>(2)ORA-22920: 未锁定含有 LOB 值的行</p>
<p>? 在select 时候 要加上 “for update ”</p>
<p>例子:</p>
<pre name="code" class="java">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();
</pre>
分享到:
相关推荐
Hibernate存储Clob字段的方式总结涉及了在Java开发中使用Hibernate操作大型文本字段Clob的操作方法。本文主要介绍了两种操作Clob字段的方法,一种是将Clob字段直接映射为String类型,另一种是使用Clob类型进行处理。...
总结,Hibernate通过`@Lob`注解支持BLOB和CLOB的持久化,开发者需要适当地将数据转换为对应的对象类型,然后使用Hibernate的CRUD操作进行保存和检索。同时,要注意性能优化,如懒加载和数据库特定的最佳实践。
在Java的持久化框架Hibernate中,BLOB(Binary Large Object)和CLOB(Character Large Object)是用来处理大数据类型的,如图像、音频、大型文本等。本文将深入探讨Hibernate如何进行BLOB和CLOB的操作,以及相关的...
Hibernate也支持直接使用Clob对象进行映射,这意味着在实体类中直接使用Clob类型的字段,然后在Hibernate的映射文件中进行相应的配置。这种方式适合处理大数据量的文本,因为它允许直接与数据库的Clob类型进行交互...
在企业级应用开发中,经常会遇到需要存储大量文本或二进制数据的情况,这时就需要用到数据库的大字段类型如CLOB(Character Large Object)和BLOB(Binary Large Object)。本文将详细介绍如何在Spring与Hibernate...
包括理解 CLOB 的概念、Hibernate 的配置与实体类设计、存储 CLOB 数据、读取 CLOB 数据以及锁定更新等方面的内容。掌握这些知识对于开发人员来说是非常有用的,尤其是在处理大量文本数据的应用场景中。
在Hibernate的映射文件(.hbm.xml)或使用注解时,可以声明一个属性为CLOB类型。例如,使用注解的方式: ```java @Lob @Column(name = "LONG_TEXT") private String longText; ``` 3. **动态映射**:动态映射...
本篇将详细介绍在Hibernate中如何处理Clob和Blob字段,以及使用特定Oracle JDBC驱动程序的优势。 首先,Hibernate通过`org.hibernate.type`包中的`ClobType`和`BlobType`来映射Clob和Blob。在实体类中,你需要定义...
Spring和Hibernate框架结合使用可以有效地进行CLOB字段的操作。以下是实现这一功能的关键步骤和注意事项: 1. **配置SessionFactory** 在Spring配置文件中,你需要创建一个`SessionFactory` bean,同时指定一个`...
Oracle的Clob数据类型在数据库中用于存储大对象(Large Object),如长文本、XML文档等大量字符数据。在Hibernate框架中,Clob类型的字段处理是数据库操作中的一个关键环节,尤其是在处理大量文本数据时。以下是对...
这篇文章主要讲解了如何使用`JDBC`和`Hibernate`这两种不同的方式来处理`CLOB`和`BLOB`字段。 1. **数据库中的`CLOB`与`BLOB`类型** - 在MySQL中,`CLOB`对应`TEXT`类型,`BLOB`对应`BLOB`类型。 - 在DB2或Oracle...
- 插入数据:在保存实体时,Hibernate会自动处理Clob和Blob对象的序列化。可以通过`getClob()`和`setClob()`方法设置和获取Clob值,对于Blob,使用`getBlob()`和`setBlob()`。 - 更新数据:同样,更新实体时,...
本文将详细介绍如何在Hibernate中操作Blob和Clob字段,实现数据的存储与读取。 首先,我们需要在Hibernate映射文件(.hbm.xml)中定义Blob和Clob字段。对于Blob,可以这样声明: ```xml ``` 这里的`name`属性...
在Hibernate,一个流行的Java对象关系映射(ORM)框架中,Blob和Clob也被广泛使用,特别是在处理大型图片、文件或长文本时。 在Hibernate和Microsoft SQL Server的环境中,Blob常用来存储图像、音频、视频等二进制...
本文将详细介绍如何使用Hibernate和JDBC读取和存储Oracle数据库中的Blob对象。 ### 1. Hibernate Blob操作 在Hibernate中,Blob对象通常与Java的`java.sql.Blob`接口相对应。在实体类中,你可以定义一个Blob类型的...
本篇文章将探讨在Hibernate中如何使用Clob类型来处理大文本数据,主要涉及Clob类型的概念、使用场景、在Hibernate中的配置以及一些注意事项。 Clob(Character Large Object)是SQL标准定义的一种数据类型,用于...