`
flamezealot
  • 浏览: 20910 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring+hibernate 中clob的使用

阅读更多

        最近在做一个博客,里面的content字段本来是使用varchar2(4000),但是实际使用发现最多只能存入600多个字符,很奇怪,具体原因还不知道。在同事建议下决定使用clob来存储大文本;

        在网上查阅了一些资料,其中一种方法是: 

在hbm文件中加 

xml 代码
  1. <property name="content" type="text">  
  2.         <column name="CONTENT" length="100000" />  
  3.     property>  

 在.java中把content字段设为String类型,就可以把clob当作varchar来操作,但是存储时就出错

streams type cannot be used in batching

之后修改ssessionfactory

xml 代码
  1. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  2.         <property name="dataSource" ref="dataSource" />  
  3. <property name="configLocations">  
  4. <list>  
  5.                 <value>classpath:config/application.cfg.xmlvalue>  
  6.                 <value>classpath:config/basecommon.cfg.xmlvalue>  
  7.                 <value>classpath:config/parameter.cfg.xmlvalue>  
  8. list>  
  9. property>  
  10. <property name="hibernateProperties">  
  11. <props>  
  12. <prop key="hibernate.dialect">....prop>  
  13. <prop key="hibernate.show_sql">trueprop>  
  14. <prop key="hibernate.format_sql">trueprop>  
  15. <prop key="hibernate.jdbc.batch_size">0prop>  
  16. props>  
  17. property>  
  18. bean>  

把batch_size设为0,之后存储很小的文本时可以正常了,但是文本一大起来,就出错

Connection reset  SQL Error: 17002, SQLState: null

上网查,得知Oracle BLOB/CLOB 字段本身拥有一个游标(cursor),JDBC通过游标对Blob/Clob字段进行操作,在Blob/Clob字段创建之前,无法获取其游标句柄,会出现
Connection reset by peer: socket write error 异常。

正确的做法是:首先创建一个空 Blob/Clob 字段,再从这个空 Blob/Clob字段获取游标。

觉得和我的错误应该差不多,于是改写代码:

xml 代码
  1. <property name="contentClob" type="clob">  
  2.         <column name="CONTENT" length="100000" />  
  3.     property>  
java 代码
  1. blog.java中   
  2. ......   
  3. private Clob contentClob;   
  4. private String content   
  5.   
  6. ......   
  7. action中   
  8. Session ssesion = persistence.getHibernateSession();   
  9. Transaction ts = ssesion.beginTransaction();   
  10. .......   
  11. blog.setAuthor(author);   
  12. blog.setContent(Hibernate.createcontentClob(" "));   
  13. blog.setTitle(title);   
  14. ssesion.save(blog);   
  15. ssesion.flush();   
  16. ssesion.refresh(blog,LockMode.UPGRADE);   
  17. CLOB clob = (CLOB)blog.getcontentClob();   
  18. Writer wt=Clob.getCharacterOutputStream();   
  19. String content = blog.getContent();   
  20. wt.write(content);   
  21. wt.close();   
  22. .......   

这样的话,会抛出类型classCast的异常,在javaeye上看了robbin的一个帖子,中间lovehibernate说了一个解决方法:

使用hibernate.lob.SerializableClob来帮助类型转换;

把CLOB clob=(CLOB)blog.getcontentClob();换为

java 代码
  1. SerializableClob clob=(SerializableClob)informationContent.getContent();    
  2. java.sql.Clob wrapClob = clob.getWrappedClob();    
  3. CLOB tmpClob=(CLOB)wrapClob;    
  4. Writer wt=tmpClob.getCharacterOutputStream();   

问题基本解决,可以正常插入了。

update的代码基本上相同:

java 代码
  1. Session ssesion = persistence.getHibernateSession();   
  2.        Transaction ts = ssesion.beginTransaction();   
  3.        Blog blog = (Blog)ssesion.load(Blog.class,this.blog.getId(),LockMode.UPGRADE);       
  4.        ......   
  5.        blog.setContent(this.blog.getContent()); 
  6.        blog.setContentClob(Hibernate.createClob(" "));  
  7.        ......   
  8.        ssesion.update(blog);   
  9.        ssesion.flush();   
  10.   
  11.        ssesion.refresh(blog, LockMode.UPGRADE);   
  12.        SerializableClob clob = (SerializableClob) blog.getContentClob();   
  13.        java.sql.Clob wrapClob = clob.getWrappedClob();   
  14.        CLOB tmpClob = (CLOB) wrapClob;   
  15.        Writer wt = tmpClob.getCharacterOutputStream();   
  16.        String content = blog.getContent();   
  17.        wt.write(content);  

如果不使用第3行那句,会报:未锁定含有 LOB 值的行 的异常.

如果不使用第6行那句,结果给字段添加内容的时候可以update成功,但是删除字段内容的时候则不会有任何效果

后来数据库改用oralce10g,发现在jdbc的包中,getCharacterOutputStream()方法都被deprecated了,于是修改为:

 

java 代码
  1. Writer wt = tmpClob.setCharacterStream(0);   
分享到:
评论
3 楼 yinbaicheng 2008-08-07  
length="100000" 视乎没有用吧
2 楼 yinbaicheng 2008-08-07  
1 楼 gaozhonghui 2008-07-16  
不知道你怎能插入了!
CLOB clob = (CLOB)blog.getcontentClob();
这个你封装了吗?
blog.setContent(Hibernate.createcontentClob(" "));

相关推荐

    spring+hibernate 解决大字段(clob)

    本示例中使用的环境配置如下: 1. **Java版本**:建议使用较新的Java版本,因为高版本的Java提供了更多的功能和性能优化。尽管理论上较低版本也能运行,但考虑到向后兼容性以及新特性支持,推荐使用较高版本。 2. *...

    spring+hibernate操作oracle的clob字段

    Spring和Hibernate框架结合使用可以有效地进行CLOB字段的操作。以下是实现这一功能的关键步骤和注意事项: 1. **配置SessionFactory** 在Spring配置文件中,你需要创建一个`SessionFactory` bean,同时指定一个`...

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

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

    Spring+Hibernate处理Oracle lob字段(一)

    在本文中,我们将深入探讨如何在Java环境下,利用Spring和Hibernate框架处理Oracle数据库中的LOB(Large Object)字段。LOB字段通常用于存储大体积的数据,如文本、图片或视频。在实际开发中,处理这类数据时可能会...

    移动ssh项目(struts+spring+hibernate+oracle).zip

    在这个名为“移动ssh项目(struts+spring+hibernate+oracle)”的压缩包中,我们可以看到一个利用这些技术构建的项目实例,结合Oracle数据库。以下是关于SSH框架及Oracle数据库的详细介绍: 1. Struts:Struts是MVC...

    spring1.2+hibernate3对大字段的处理实例,供大家学习与交流,可直接运行

    总结来说,"spring1.2+hibernate3对大字段的处理实例"是一个宝贵的教育资源,它涵盖了Spring和Hibernate在处理大字段时的关键技术,以及如何在Eclipse环境中实现这些技术。通过对这个实例的学习和研究,开发者能够...

    spring1.2+hibernate2对大字段的处理实例

    在IT领域,尤其是在Java开发中,Spring和Hibernate是两个非常重要的框架。Spring1.2是Spring框架的一个早期版本,它提供了依赖注入、AOP(面向切面编程)等功能,为应用提供了一个轻量级的容器。而Hibernate2则是ORM...

    oracle+hibernate 处理blob +uploadify实例

    综上所述,这个实例展示了如何在Oracle数据库中使用Hibernate处理Blob数据,结合Uploadify实现文件上传。这种解决方案不仅适用于Oracle,理论上也适用于其他支持Blob类型的数据库,如MySQL和MSSQLServer。了解这些...

    java存lob数据到sybase数据库

    通过spring存blob和clob数据到sybase数据库中,压缩包里包含了三种方式,(1)spring+hibernate,切面事务(aop),存lob数据,(2)spring+hibernate存lob数据,(3)spring+jdbc存lob数据。

    hibernate存取oracle的clob

    本文详细介绍了如何使用 Hibernate 来存取 Oracle 数据库中的 CLOB 数据。包括理解 CLOB 的概念、Hibernate 的配置与实体类设计、存储 CLOB 数据、读取 CLOB 数据以及锁定更新等方面的内容。掌握这些知识对于开发...

    ssh(structs,spring,hibernate)框架中的上传下载

    3在Spring中使用org.springframework.jdbc.support.lob.OracleLobHandler处理Oracle数据库的Blob类型字段。  通过这样的设置和配置,我们就可以象持久化表的一般字段类型一样处理Blob字段了。  以上是Spring+...

    spring3+springmvc+jpa2+gae

    Spring 3是其较早的一个版本,但仍然广泛使用,提供了依赖注入(DI)、面向切面编程(AOP)以及对其他框架如MyBatis、Hibernate的整合支持。 **Spring MVC** Spring MVC是Spring框架的一部分,专为构建Web应用程序...

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

    在 Java 中,处理 Clob 和 Blob 类型需要使用特殊的注解配置来确保正确地读取和写入数据。 一、Clob 类型的注解配置 在 Java 中,处理 Clob 类型需要使用 @Lob 注解来指定该字段为大规模字符数据类型。@Lob 注解...

    hibernate使用中与各种数据库字段类型对应类型训练

    9. **枚举类型**:在数据库中可以使用CHAR或INT存储,Hibernate通过`@Enumerated`注解支持枚举类型映射。 在实际应用中,我们还需要关注以下几点: - **级联操作**:如CascadeType.PERSIST、CascadeType.MERGE等,...

    Spring,SpringMVC,Hibernate,Oracle知识汇总

    Spring、SpringMVC、Hibernate和Oracle是Java开发中常见的四大技术框架,它们各自在软件开发中扮演着重要的角色。下面是对这些技术的详细介绍。 **Spring框架**:Spring 是一个全面的后端应用开发框架,核心特性是...

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    使用Jdbc4操作Blob,Clob

    此外,如果你的项目中使用了ORM框架如Hibernate,它提供了更高级别的抽象来处理LOB对象,使得操作更加简洁。在提供的`Hibernate4_Spring3_Blob_Test`压缩包中,可能包含了使用Hibernate4和Spring3来测试Blob操作的...

    upload-files-example:使用 Spring、Hibernate +JPA 的 REST 应用程序设计示例

    上传文件示例关于如何使用 Spring Boot、Hibernate + JPA 注释设计 REST API 的示例项目。 截至目前,已提供表单数据/多部分端点以创建和获取包含 UUID 主键和 CLOB 属性的“模板”。 使用 H2 作为嵌入式数据库。

    Hibernate 多数据库支持解决方案

    这可以通过在实体类中使用Hibernate的`@ManyToOne`, `@OneToOne`, `@OneToMany`等注解来控制关联,而不是依赖于数据库的外键约束。 2. **动态加载.hbm.xml文件** - Hibernate允许通过配置文件来动态加载对应当前...

    Apress.Spring.Persistence – A.Running.Start.Feb.2009.pdf

    - **声明式事务**:阐述了如何在Spring中使用声明式事务管理,简化事务逻辑的编写。 - **应用分层**:强调了应用的层次结构,包括领域模型层、DAO层和服务层,每一层都有其特定的职责。 - **理解持久化选项**:分析...

Global site tag (gtag.js) - Google Analytics