最近在做一个博客,里面的content字段本来是使用varchar2(4000),但是实际使用发现最多只能存入600多个字符,很奇怪,具体原因还不知道。在同事建议下决定使用clob来存储大文本;
在网上查阅了一些资料,其中一种方法是:
在hbm文件中加
xml 代码
- <property name="content" type="text">
- <column name="CONTENT" length="100000" />
- property>
在.java中把content字段设为String类型,就可以把clob当作varchar来操作,但是存储时就出错
streams type cannot be used in batching
之后修改ssessionfactory
xml 代码
- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="configLocations">
- <list>
- <value>classpath:config/application.cfg.xmlvalue>
- <value>classpath:config/basecommon.cfg.xmlvalue>
- <value>classpath:config/parameter.cfg.xmlvalue>
- list>
- property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">....prop>
- <prop key="hibernate.show_sql">trueprop>
- <prop key="hibernate.format_sql">trueprop>
- <prop key="hibernate.jdbc.batch_size">0prop>
- props>
- property>
- 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 代码
- <property name="contentClob" type="clob">
- <column name="CONTENT" length="100000" />
- property>
java 代码
- blog.java中
- ......
- private Clob contentClob;
- private String content
-
- ......
- action中
- Session ssesion = persistence.getHibernateSession();
- Transaction ts = ssesion.beginTransaction();
- .......
- blog.setAuthor(author);
- blog.setContent(Hibernate.createcontentClob(" "));
- blog.setTitle(title);
- ssesion.save(blog);
- ssesion.flush();
- ssesion.refresh(blog,LockMode.UPGRADE);
- CLOB clob = (CLOB)blog.getcontentClob();
- Writer wt=Clob.getCharacterOutputStream();
- String content = blog.getContent();
- wt.write(content);
- wt.close();
- .......
这样的话,会抛出类型classCast的异常,在javaeye上看了robbin的一个帖子,中间lovehibernate说了一个解决方法:
使用hibernate.lob.SerializableClob来帮助类型转换;
把CLOB clob=(CLOB)blog.getcontentClob();换为
java 代码
- SerializableClob clob=(SerializableClob)informationContent.getContent();
- java.sql.Clob wrapClob = clob.getWrappedClob();
- CLOB tmpClob=(CLOB)wrapClob;
- Writer wt=tmpClob.getCharacterOutputStream();
问题基本解决,可以正常插入了。
update的代码基本上相同:
java 代码
- Session ssesion = persistence.getHibernateSession();
- Transaction ts = ssesion.beginTransaction();
- Blog blog = (Blog)ssesion.load(Blog.class,this.blog.getId(),LockMode.UPGRADE);
- ......
- blog.setContent(this.blog.getContent());
- blog.setContentClob(Hibernate.createClob(" "));
- ......
- ssesion.update(blog);
- ssesion.flush();
-
- ssesion.refresh(blog, LockMode.UPGRADE);
- SerializableClob clob = (SerializableClob) blog.getContentClob();
- java.sql.Clob wrapClob = clob.getWrappedClob();
- CLOB tmpClob = (CLOB) wrapClob;
- Writer wt = tmpClob.getCharacterOutputStream();
- String content = blog.getContent();
- wt.write(content);
如果不使用第3行那句,会报:未锁定含有 LOB 值的行 的异常.
如果不使用第6行那句,结果给字段添加内容的时候可以update成功,但是删除字段内容的时候则不会有任何效果
后来数据库改用oralce10g,发现在jdbc的包中,getCharacterOutputStream()方法都被deprecated了,于是修改为:
java 代码
- Writer wt = tmpClob.setCharacterStream(0);
分享到:
相关推荐
本示例中使用的环境配置如下: 1. **Java版本**:建议使用较新的Java版本,因为高版本的Java提供了更多的功能和性能优化。尽管理论上较低版本也能运行,但考虑到向后兼容性以及新特性支持,推荐使用较高版本。 2. *...
Spring和Hibernate框架结合使用可以有效地进行CLOB字段的操作。以下是实现这一功能的关键步骤和注意事项: 1. **配置SessionFactory** 在Spring配置文件中,你需要创建一个`SessionFactory` bean,同时指定一个`...
一个完整的工程,主要功能为:spring+hbernate对clob、blob字段的处理 包括:数据脚本、典型的SSH框架处理,以及spring、hibernate数据批量保存等功能源码、所用到的lib包 数据环境为:oracle 10G 开发:Mycelipse5.1...
在本文中,我们将深入探讨如何在Java环境下,利用Spring和Hibernate框架处理Oracle数据库中的LOB(Large Object)字段。LOB字段通常用于存储大体积的数据,如文本、图片或视频。在实际开发中,处理这类数据时可能会...
在这个名为“移动ssh项目(struts+spring+hibernate+oracle)”的压缩包中,我们可以看到一个利用这些技术构建的项目实例,结合Oracle数据库。以下是关于SSH框架及Oracle数据库的详细介绍: 1. Struts:Struts是MVC...
总结来说,"spring1.2+hibernate3对大字段的处理实例"是一个宝贵的教育资源,它涵盖了Spring和Hibernate在处理大字段时的关键技术,以及如何在Eclipse环境中实现这些技术。通过对这个实例的学习和研究,开发者能够...
在IT领域,尤其是在Java开发中,Spring和Hibernate是两个非常重要的框架。Spring1.2是Spring框架的一个早期版本,它提供了依赖注入、AOP(面向切面编程)等功能,为应用提供了一个轻量级的容器。而Hibernate2则是ORM...
综上所述,这个实例展示了如何在Oracle数据库中使用Hibernate处理Blob数据,结合Uploadify实现文件上传。这种解决方案不仅适用于Oracle,理论上也适用于其他支持Blob类型的数据库,如MySQL和MSSQLServer。了解这些...
通过spring存blob和clob数据到sybase数据库中,压缩包里包含了三种方式,(1)spring+hibernate,切面事务(aop),存lob数据,(2)spring+hibernate存lob数据,(3)spring+jdbc存lob数据。
本文详细介绍了如何使用 Hibernate 来存取 Oracle 数据库中的 CLOB 数据。包括理解 CLOB 的概念、Hibernate 的配置与实体类设计、存储 CLOB 数据、读取 CLOB 数据以及锁定更新等方面的内容。掌握这些知识对于开发...
3在Spring中使用org.springframework.jdbc.support.lob.OracleLobHandler处理Oracle数据库的Blob类型字段。 通过这样的设置和配置,我们就可以象持久化表的一般字段类型一样处理Blob字段了。 以上是Spring+...
Spring 3是其较早的一个版本,但仍然广泛使用,提供了依赖注入(DI)、面向切面编程(AOP)以及对其他框架如MyBatis、Hibernate的整合支持。 **Spring MVC** Spring MVC是Spring框架的一部分,专为构建Web应用程序...
在 Java 中,处理 Clob 和 Blob 类型需要使用特殊的注解配置来确保正确地读取和写入数据。 一、Clob 类型的注解配置 在 Java 中,处理 Clob 类型需要使用 @Lob 注解来指定该字段为大规模字符数据类型。@Lob 注解...
9. **枚举类型**:在数据库中可以使用CHAR或INT存储,Hibernate通过`@Enumerated`注解支持枚举类型映射。 在实际应用中,我们还需要关注以下几点: - **级联操作**:如CascadeType.PERSIST、CascadeType.MERGE等,...
Spring、SpringMVC、Hibernate和Oracle是Java开发中常见的四大技术框架,它们各自在软件开发中扮演着重要的角色。下面是对这些技术的详细介绍。 **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...
此外,如果你的项目中使用了ORM框架如Hibernate,它提供了更高级别的抽象来处理LOB对象,使得操作更加简洁。在提供的`Hibernate4_Spring3_Blob_Test`压缩包中,可能包含了使用Hibernate4和Spring3来测试Blob操作的...
上传文件示例关于如何使用 Spring Boot、Hibernate + JPA 注释设计 REST API 的示例项目。 截至目前,已提供表单数据/多部分端点以创建和获取包含 UUID 主键和 CLOB 属性的“模板”。 使用 H2 作为嵌入式数据库。
这可以通过在实体类中使用Hibernate的`@ManyToOne`, `@OneToOne`, `@OneToMany`等注解来控制关联,而不是依赖于数据库的外键约束。 2. **动态加载.hbm.xml文件** - Hibernate允许通过配置文件来动态加载对应当前...
- **声明式事务**:阐述了如何在Spring中使用声明式事务管理,简化事务逻辑的编写。 - **应用分层**:强调了应用的层次结构,包括领域模型层、DAO层和服务层,每一层都有其特定的职责。 - **理解持久化选项**:分析...