@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。
答案 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
这对我有用。