为什么Hibernate切换到使用LONG over CLOB?

2022-09-04 22:26:47

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

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

有谁知道为什么会改变这一点?

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

一个可能的解决方法是覆盖 :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,让我们看看会发生什么。


答案 1

看起来这个问题的解决方案是使用,至少这是盖尔·巴德纳在HHH-5569上所说的。materialized_clob

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


答案 2

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

HHH-3892 已经这样做了 - 改进了对将 SQL LONGVARCHAR 和 CLOB 映射到 Java String、SQL LONGVARBINARY 和 BLOB 到 Java byte[] 的支持(文档更新由 HHH-4878 跟踪)。

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

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

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

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


推荐