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

标签 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;
}

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

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

谢谢。

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

最佳答案

众所周知,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>

关于java - 无法在数据库中保存 clob 数据类型(Struts、Spring、Hibernate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2115420/

相关文章:

java - 我们可以在 ODI 11G 中使用 Oracle ODI SDK 公共(public) API 创建 IKM 吗?

xml - Oracle - 验证日期格式 (yyyy-mm-ddThh24 :mi:ssZ) in XML against XSD

hibernate - 在JSF2.0、Hibernate、MySQL中启用UTF-8字符集

java - 如何使用反射设置原始数组字段?

java - Java中的反射(区分两种类型)

java - 如何修复位于另一个预先绘制的 JPanel 之上的 JPanel 上的动态移动图像的闪烁?

java - 使用 Struts 2 和 Hibernate 编辑行不起作用

java - 在 "on the fly"java图片生成中指定图片名称

Oracle 约束和空值

mysql - 服务器端 Spring + Freemarker + Hibernate(EM) + MySql UTF-8 字符