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

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

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

谢谢。

编辑: 我正在使用 Oracle 10g。列类型为 CLOB。

4

3 回答 3

4

众所周知,Oracle 提供的POS瘦驱动程序会在您尝试保存超过 4K 时自动且静默地使 CLOB 字段无效(保存超过 4K,这对 cLob 来说太棒了)。然而,当使用标准 API(Hibernate 所做的)与 Oracle 10g JDBC 驱动程序一起使用时,这应该是有效的(请参阅在 Oracle 10g 中处理 Clob)。令人惊讶的是,许多线程(例如这个)提到旧版本的 Oracle 10g 瘦驱动程序存在类似问题,因此请确保您使用Oracle 10g 第 2 版驱动程序(选择最新的 ojdbc14.jar 即 10.2.0.4)或更高版本

请注意,Oracle对 CLOB 有 32K 的限制。要克服此限制,您需要将连接属性设置SetBigStringTryClobtrue. 根据各种消息来源,您似乎还需要禁用 JDBC 批处理(即设置batch_size0)。

为此,请将以下属性添加到您的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>
于 2010-01-25T07:02:36.213 回答
0

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

于 2010-01-22T20:43:05.890 回答
0

如果想通过休眠插入数据,请在您的 springs 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。所以用 ojdbc14.jar 替换 classes12.jar

这对我有用。

于 2013-05-16T10:16:08.920 回答