Hibernate + Oracle + Clob:属性内容被切换

时间:2010-07-05 08:33:48

标签: oracle hibernate jpa clob

之前有人听说过这个错误:

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

这不是开玩笑!

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

4 个答案:

答案 0 :(得分:0)

我不是百分百确定,但您可以尝试将连接属性SetBigStringTryClob设置为true(请参阅How To Handle CLOBs Easily in JDBC?)。

如果您使用的是Spring,请执行以下操作:

<property name="hibernateProperties">
  <props>
    <prop key="hibernate.connection.SetBigStringTryClob">true</prop>
  </props>
</property>

答案 1 :(得分:0)

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

name =“hibernate.dialect”value =“org.hibernate.dialect.Oracle10gDialect”

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

答案 2 :(得分:0)

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

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

答案 3 :(得分: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");
}