hibernate 保存clob,blob出现的问题

在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();   
            	 

   

写完,收工。

HibernateBLOB CLOB操作详解 Sql代码   1. create table users   2. (   3.  uids int primary key,   4.  img blob,   5.  txt clob   6. )     Java代码   1. import java.io.FileInputStream;   2. import java.io.FileNotFoundE 阅读详情

相关推荐

Hibernate存储Clob字段的方式总结

介绍了利用Hibernate将一个长字符串转换为流存储至Clob字段中,然后再从Clob字段中读出来,转换为字符串输出的方式

关于hibernate查询,数据库字段为clob的错误原因及解决方法记录

关于hibernate查询,数据库字段为clob的错误原因及解决方法记录

beat1314的博客 3121

hibernate保存blob,clob对象

NULL 博文链接:https://sxpujs.iteye.com/blog/368960

Hibernate保存OracleClob字段的解决方案

 备注:本文系原创,欢迎转载。转载请注明出处: http://blog.csdn.net/techyang    Session session = HibernateUtil.currentSession();//建立session     HibernateUtil.beginTransaction(); //开始事务     uMovieInfo.setContent(Hibernate

techyang 的专栏 (一万年太久,只争朝夕) 4495

Hibernate 事务方法保存clob类型数据

Hibernate 保存clob类型数据 以及关系到事务所出现的问题(写此文以防备忘)说明:方法A():普通的方法未实现事务;方法B();普通方法;方法doA();对A方法增加事务支持方法doB():对方法B()增加事务支持方法ntB();对方法B()声明一个新的事物使用方式一:A(){   doB();}doB(){    //方法中保存一个Clob字段到数据库}按照上述调用会出现错误:Active Spring transaction synchronization or active JTA tran

JSH'S 1021

利用Hibernate储存大对象到达梦数据库中

使用达梦数据库的大字段前不得不说一下数据库大字段的性能问题:在数据库中,经常需要用到大字段类型,如Oracle中long、blobclobSQLServer中的text、image,MySql中的text、longtext、clobblob以及达梦数据库中的clobblob类型。存储的信息大概主要是两类,一类是长文本,如大段的文字,普通的varchar最长只能存储4K的数据,已经不能满足要

yanglilibaobao的专栏 2286

java clob 释放_JAVA中处理CLOBBLOB的注解问题

JAVA中处理CLOBBLOB的注解问题java中处理Clob类型:1、注解符处理:@Lob@Basic(fetch = FetchType.EAGER)@Column(name="SUBSTANCE", columnDefinition="CLOB",nullable=true)这种配置完全错误导致信息过长保存失败;1>正确配置方法如下:2>在spring配置文件需要配置:Blob...

weixin_39946029的博客 284

hibernate 保存 oracle 10g大数据字段

用spring+hiberante保存blob的时候,报Active Spring transaction synchronization or active JTA transaction with 'jtaTransactionManager' on LocalSessionFactoryBean required 这样的错,在网上查了一大堆资料后依然没有解决问题,后来看到一信息是这样写的: ...

tcrct 221

hibernate 写入 clob, Blob

import java.io.FileInputStream; import java.io.OutputStream;import org.hibernate.Hibernate; import org.hibernate.LockMode; import org.hibernate.Session; import org.hibernate.Transaction; import org.

银狐的专栏 862

hibernateclobblob的操作

static Session session = HibernateSessionFactory.getSession(); public boolean inserted(TUser obj) {  Transaction tran = session.beginTransaction();  session.save(obj);  session.flush();//调用flush强制

Bob@CSDN 957

mysql blob hibernate_Hibernate保存BlobClob类型的数据

虽然非常不建议在数据库中保存BlobClob类型的数据,但真的要有这样的需求呢?这里记录一下使用Hibernate如何向数据库中保存BlobClob数据Oracle和MySqlBlob类型上没什么区别,但是Mysql没有Clob类型,取而代之的是Text类型,所以这里还有点区别。BLOB数据库中是以二进制的形式存在的,所以无法直接看到,如果是图片的话,使用一些数据库管理软件还是可以看到图...

weixin_35932973的博客 428

如何使用Hibernate 保存ClobBlob

今天书上让用ORACLE数据库建表,有个CLOB类型,,不知道到底怎么保存,用String也不行,,当时就怒了。。。 注意:目前只能操作Clob,因为不想用Session直接操作!  Clob数据库中一般都是用来保存大文本字段的,Blob则是保存二进制流这样的!  1、Hibernate操作Clob字段  A.在实体Bean中将Clob字段声明为Str

624

BLOB/CLOB类型在HIBERNATE中的应用

    为什么需要clob/blob对象?         在实际的项目开发过程当中,有时候需要存取比较大的数据。而在oracle中,varchar2的长度不能够满足需求,因此就得需要用到clob/blob。    BLOB/CLOBHIBERNATE中的如何应用?          为了更好的理解,我们举一个文章发布的例子做为讨论。          实体类(POJO)MessageA

黄贻军[bluesunny]的专栏 971

Hibernate4 Blob Clob图片保存数据库和读取

Hibernate4 Blob Clob图片保存数据库和读取 /保存图片到数据库 static void save(){ HibernateUtilutil=new HibernateUtil(); Sessionsession=util.getSession(); Transactiontran=session.beginTransaction(); Student1s=new Student1(); try { InputStr

_小点的博客 1870

hibernate存入和写出BlobClob

Person .java package www.csdn.net.blank.bean; import java.io.Serializable; import java.sql.Blob; import java.sql.Clob; public class Person implements Serializable{ /** * */ private st

yanmei的专栏 2873

hibernate 操作clobblob对象

转自:http://hpingliu.blog.ccidnet.com/blog-htm-do-showone-type-blog-itemid-144245-uid-48802.html] 作为测试,我们新建一个TUser对象,其image属性中,保存了一个图片文件的二进制内容。而其resume属性,我们以一个简单的字符串作为填充。 1 TUser user = new TUser(); 2 3...

friping的专栏 192

hibernate映射clob blob字段

在许多情况下要存储大型字符串或者二进制数据如图片等hibernate也提供了对blobclob类型的支持 blob采用单字节存储适合保存二进制数据,如图片文件clob采用多字节存储适合保存大型文本等 在mssql中 image和ntext分别对应着blobclob 表映射文件对两种类型的写法 对于blob格式的映射类型为type="java.sql.Clob";

pingchagnxin007的专栏 741

hibernate mysql clob_Hibernate实现ClobBlob对象的存取

作为测试,我们新建一个TUser对象,其image属性中,保存了一个图片文件的二进制内容。而其resume属性,我们以一个简单的字符串作为填充。1TUseruser= new TUser();2 3user.setAge(new Integer( 20 ));4 5user.setName(" Shark ");6 7FilelnputStreamimgis= new FileinputS...

weixin_31040783的博客 389
上一篇: hibernate 操作clob,blob对象
下一篇: HTML表单Form中的get和post方法
friping
博客等级 码龄19年 0粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值