无法在数据库中保存clob数据类型(Struts,Spring,Hibernate)

时间:2010-01-22 06:14:11

标签: java oracle hibernate spring clob

@Column(name="transpired")
@Lob
private String transpired;
public String getTranspired() {
    return transpired;
}
public void setTranspired(String transpired) {
    this.transpired = transpired;
}

我尝试在我们的模型类中使用以下代码。 “透明”是一个包含长文本消息(报告)的字段。查看“报告”时,它会从数据库中检索数据并在我们的UI中正确显示。但是,当我保存(编辑或创建)报表时,数据库中的字段保存为(null)。

关于如何保存长文本的任何想法?我们之前使用的是varchar2(4000),但大多数报告都超过4000个字符。

感谢。

修改 我正在使用Oracle 10g。列类型为CLOB。

3 个答案:

答案 0 :(得分:4)

Oracle提供的 POS 瘦驱动程序众所周知,当您尝试保存超过4K时,会自动并静默地使CLOB字段无效(节省4K以上,cLob令人惊叹)。然而,当使用标准API(Hibernate所做的)与Oracle 10g JDBC驱动程序(参见Handling Clobs in Oracle 10g)时,假设正在工作。令人惊讶的是,许多线程(例如this one)在旧版本的Oracle 10g瘦驱动程序中提到了类似的问题,因此请确保使用Oracle 10g Release 2 drivers(获取最新的ojdbc14.jar即10.2.0.4)<强>或以后。

请注意,Oracle有一个limitation of 32K for CLOBs。要克服此限制,您需要将连接属性SetBigStringTryClob设置为true。根据各种消息来源,您似乎还需要禁用JDBC批处理(即将batch_size设置为0)。

为此,请将以下属性添加到hibernate.cfg.xml(或在Spring配置中)。

<!-- Tell Oracle to allow CLOBs larger than 32K -->
<property name="hibernate.connection.SetBigStringTryClob">true</property>
<property name="hibernate.jdbc.batch_size">0</property>

答案 1 :(得分:0)

使用oracle9i我遇到了同样的问题我无法解决它,我不得不通过JDBC手动完成它,但是在JPA中它是一块蛋糕。我不知道他们是否在休眠时解决了它,这是一年半前的事情:(

答案 2 :(得分:0)

如果想通过hibernate插入数据,请在spring XML

中添加以下代码
<property name="hibernate.connection.SetBigStringTryClob">true</property>
 <property name="hibernate.jdbc.batch_size">0</property>

<prop key="hibernate.connection.SetBigStringTryClob">true</prop>
 <prop key="hibernate.jdbc.batch_size">0</prop>

如果您对通过JDBC添加感兴趣,请在数据源中添加以下代码,例如适用于JBOSS的Oracle-ds.xml

<connection-property name="SetBigStringTryClob">true</connection-property> 

确保使用最新的ojdbc14.jar和JDBC连接,并且像classes12.jar这样的一些jar阻碍了保存巨大的clob.So用ojdbc14.jar替换classes12.jar

这对我有用。