3

有没有人听说过这个错误:

我有一个 Java 5 应用程序,它使用 Hibernate 3.3.2 访问 Oracle 数据库 10g,JDBC 驱动程序是 Oracle 轻驱动程序版本 10.2.0.4.0(我认为是最新版本)。数据库访问发生在通过 spring 的 AOP 工具管理的事务期间。有一个数据库表映射到一个 Java 实体,映射是通过注解完成的。此实体中有两个属性是数据库中的 CLOB。它们根据 JPA 使用“Lob”进行注释,并且是 Java 字符串。一切正常,除非两个属性的值都超过 4000 个字符:提交后,值在数据库上被切换,即属性 A 包含属性 B 的值,反之亦然。

这不是一个玩笑!

Eclipse 调试器告诉我,Java 实体在事务关闭之前具有正确的值(我没有调试到 spring 事务处理中)。如果两个 Clob 都使用 Hibernate 注释 'Type(type = "clob")' 进行注释,则不会发生此错误(在这种情况下,它们必须是 java.sql.Clob 类型而不是 String,当然)。

4

4 回答 4

0

我也有完全一样的问题。一张桌子上有两个 CLOB。在插入件上只设置了一个,一切都很好。在更新时,我设置了第二个,并在提交后交换了表上的值。两者都包含超过 4000 个字符。调试和bean上的值是正确的。可悲的是,我的属性中已经有 org.hibernate.dialect.Oracle10gDialect。(休眠版本 4.2.2.Final)

//UPDATE 目前作为一种解决方法,我在 JPA 注释中将第一列设置为可更新 = false,以便在休眠生成更新查询期间现在只有一个 CLOB 列。我可以这样做,因为在这种特殊情况下,我不需要在插入后更改值,但这不是一般的解决方案。

于 2013-10-14T14:33:48.843 回答
0

同时我找到了解决问题的方法:SQL方言错误,有人将其设置为Oracle9而不是正确的版本,即:

name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"

设置正确的 SQL 方言可以解决问题:-)

于 2010-08-01T10:49:29.740 回答
0

我不是 100% 确定,但您可以尝试将连接属性设置SetBigStringTryClobtrue(请参阅如何在 JDBC 中轻松处理 CLOB?)。

如果您使用的是 Spring,则如下所示:

<property name="hibernateProperties">
  <props>
    <prop key="hibernate.connection.SetBigStringTryClob">true</prop>
  </props>
</property>
于 2010-07-05T09:44:29.460 回答
0

唯一对我们有用的是使用 hql 查询进行更新。每个查询更新一个 CLOB(所以我们需要两个单独的查询):

Query query = em.createQuery("update SomeTable as someTable set value = :value where id = :id");
query.setParameter("value", value);
query.setParameter("id", id);
if (query.executeUpdate() != 1) {
    throw new Exception("Value update had no effect");
}
于 2014-08-10T13:08:07.040 回答