13

看起来 HibernateLONG在 3.5.5 版本(我们从 3.2.7 升级)中开始使用数据类型,而CLOB不是type="text".

这会导致问题,因为Oracle 中的数据类型是不应使用LONG的旧的过时数据类型(请参阅http://www.orafaq.com/wiki/LONGLONG ),并且表中的列不能超过一个一种数据类型。

有谁知道为什么这已经改变?

我尝试将 OracleSetBigStringTryClob属性设置为 true(如Hibernate > CLOB > Oracle :( ) 中所建议的那样,但这不会影响数据类型映射,而只会影响与我的情况无关的数据传输内部。

一种可能的解决方法是覆盖org.hibernate.dialect.Oracle9iDialect

public class Oracle9iDialectFix extends Oracle9iDialect {
  public Oracle9iDialectFix() {
    super();
    registerColumnType(Types.LONGVARCHAR, "clob");
    registerColumnType(Types.LONGNVARCHAR, "clob");
  }
}

然而,这是最后的手段——覆盖这个类更接近于分叉 Hibernate,我宁愿避免这样做。

谁能解释为什么这样做?这应该作为一个错误提出吗?

[更新]:我创建了https://hibernate.atlassian.net/browse/HHH-5569,让我们看看会发生什么。

4

3 回答 3

4

谁能解释为什么这样做?这应该作为一个错误提出吗?

这已针对HHH-3892完成-改进了对将 SQL LONGVARCHAR 和 CLOB 映射到 Java 字符串、SQL LONGVARBINARY 和 BLOB 到 Java byte[]的支持(文档更新由HHH-4878跟踪)。

并且根据同样的问题,旧的行为是错误的。

(注意:目前,org.hibernate.type.TextType 错误地将“文本”映射到 java.sql.Types.CLOB;这将通过此问题修复并在数据库方言中更新)

您总是可以提出问题,但简而言之,我的理解是,type="clob"如果您想将属性映射到CLOB.

PS:提供你自己的Dialect并在你的 Hibernate 配置中声明它(这与 fork 无关)是恕我直言,从长远来看不是一个解决方案。

于 2010-09-15T20:55:50.117 回答
4

看起来这个问题的解决方案是使用materialized_clob,至少 Gail Badner 在HHH-5569上是这么说的。

这对我一点帮助都没有(我留下了相关的评论),但可能对这里的其他人有帮助。无论如何,这个错误被拒绝了,我对此无能为力,但使用覆盖的方言:(

于 2011-01-11T11:21:50.393 回答
1

我无法回答您关于为什么的问题,但是对于 Hibernate 6,他们似乎正在考虑切换回使用CLOB

于 2019-07-05T15:25:08.300 回答