`
friping
  • 浏览: 133827 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

   

写完,收工。

分享到:
评论
1 楼 王海云 2012-04-16  
p.executeUpdate();    

相关推荐

    hibernate保存blob,clob对象

    以上就是关于在Hibernate中保存Blob和Clob对象的基本操作。在实际项目中,还需要考虑性能优化、错误处理等问题,例如使用流式处理减少内存占用,以及适当地配置Hibernate的缓存策略等。了解并熟练掌握这些技巧,能...

    Hibernate对BLOB CLOB操作

    在Java的持久化框架Hibernate中,BLOB(Binary Large Object)和CLOB(Character Large Object)是用来处理大数据类型的,如图像、音频、大型文本等。本文将深入探讨Hibernate如何进行BLOB和CLOB的操作,以及相关的...

    Hibernate操作Oarcle中Clob、Blob字段小结

    - 插入数据:在保存实体时,Hibernate会自动处理Clob和Blob对象的序列化。可以通过`getClob()`和`setClob()`方法设置和获取Clob值,对于Blob,使用`getBlob()`和`setBlob()`。 - 更新数据:同样,更新实体时,...

    关于在Hibernate中对于Clob,Blob字段的处理方法

    例如,当你调用`session.saveOrUpdate(entity)`或`entityManager.persist(entity)`时,Hibernate会将Clob和Blob的内容正确地保存到数据库中。 当从数据库中检索这些字段时,同样可以通过Hibernate的API获取。例如,...

    Hibernate对Blob,Clob的操作

    在保存数据时,Blob可以接收FileInputStream或byte[]作为参数,Clob则接受String: ```java // 对于Blob byte[] imageData = ...; // 从文件或网络获取 session.saveOrUpdate(entity); entity.setBinaryData(new ...

    hibernate Blob、Clob字段的映射的例子

    hibernate Blob、Clob字段的映射的例子.数据库mysql,数据库放在文件夹里面,例子的说明文章在我的csdn blog: http://blog.csdn.net/zhengcandan

    解析使用jdbc,hibernate处理clob/blob字段的详解

    这篇文章主要讲解了如何使用`JDBC`和`Hibernate`这两种不同的方式来处理`CLOB`和`BLOB`字段。 1. **数据库中的`CLOB`与`BLOB`类型** - 在MySQL中,`CLOB`对应`TEXT`类型,`BLOB`对应`BLOB`类型。 - 在DB2或Oracle...

    spring+hibernate 解决大字段(clob)

    ### Spring与Hibernate处理大字段(CLOB/BLOB) 在企业级应用开发中,经常会遇到需要存储大量文本或二进制数据的情况,这时就需要用到数据库的大字段类型如CLOB(Character Large Object)和BLOB(Binary Large ...

    使用hibernate对oracle读取blob

    无论是Hibernate还是JDBC,获取到Blob的输入流后,你可能需要将其保存到本地文件或者进行其他处理。这涉及到文件流的读写操作: ```java FileOutputStream outputStream = new FileOutputStream("outputFilePath");...

    java中(注解符)处理Clob(blob)类型

    四、处理 Clob 和 Blob 类型的常见问题 在处理 Clob 和 Blob 类型时,常见的问题包括: * 配置错误:如果配置错误,可能会导致数据读取或写入失败。 * 数据太大:如果数据太大,可能会导致内存溢出或性能问题。 * ...

    关于Clob类型在Hibernate中 的应用小结

    此外,还要注意数据库的性能,比如使用BLOB而非CLOB,根据数据的性质选择更合适的存储方式。 总的来说,理解和掌握Clob在Hibernate中的应用对于开发处理大文本数据的系统至关重要。通过合理的配置和使用,可以有效...

    Struts2 Hibernate存取Oracle数据库中的BLOB数据.pdf

    在实际操作中,可以通过Hibernate实现Oracle数据库中BLOB数据的存储和删除操作,然后利用Struts2框架展示这些BLOB数据。这样的结合,不仅可以提高开发效率,还能保证应用的性能和稳定性。 ### 实际操作步骤 在实际...

    hibernate动态映射表处理oracle的clob类型

    - 使用Blob/Clob接口:直接操作Clob接口进行读写,而不是将其转换为字符串或其他数据类型,以减少转换开销。 通过以上内容,你应该对在Hibernate中动态映射Oracle 10g的CLOB类型有了深入理解,这将帮助你在实际...

    Blob和Clob使用例子

    在Hibernate,一个流行的Java对象关系映射(ORM)框架中,Blob和Clob也被广泛使用,特别是在处理大型图片、文件或长文本时。 在Hibernate和Microsoft SQL Server的环境中,Blob常用来存储图像、音频、视频等二进制...

    spring+hbernate对clob、blob字段的处理

    一个完整的工程,主要功能为:spring+hbernate对clob、blob字段的处理 包括:数据脚本、典型的SSH框架处理,以及spring、hibernate数据批量保存等功能源码、所用到的lib包 数据环境为:oracle 10G 开发:Mycelipse5.1...

    spring+hibernate操作oracle的clob字段

    在Spring配置文件中,你需要创建一个`SessionFactory` bean,同时指定一个`lobHandler`属性,用于处理CLOB和BLOB类型的数据。这确保了Spring和Hibernate能够正确地与Oracle数据库交互处理大对象。 ```xml ...

Global site tag (gtag.js) - Google Analytics