@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/