【问题标题】:Why has Hibernate switched to use LONG over CLOB?为什么 Hibernate 转而使用 LONG 而不是 CLOB?
【发布时间】:2019-07-05 23:37:04
【问题描述】:

看起来 Hibernate 在 3.5.5 版本(我们从 3.2.7 升级)中开始使用 LONG 数据类型,而不是 CLOB 用于 type="text" 的属性。

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

有谁知道为什么要改这个?

我尝试将 Oracle SetBigStringTryClob 属性设置为 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,让我们看看会发生什么。

【问题讨论】:

  • 您是否尝试过使用更高版本的方言?我们发现切换到 10g 方言在其中一些方面有很大帮助。编辑:我假设您正在使用它来生成 ddl - 对吗?
  • 我们正在使用 Hibernate 的功能,如果表格不存在,它会自动按需创建表格。也就是说,这种变化让我们的生活变得非常痛苦,因为新安装的桌子与旧安装的桌子的结构不同。不过还是谢谢你的建议,明天我去看看10g方言。

标签: java oracle hibernate orm clob


【解决方案1】:

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

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

【讨论】:

  • 谢谢!这个提示帮助我解决了我的 postgreSQL 映射问题。我现在可以将 materialized_clobs 重新映射到我想要的类型(在我的例子中是 TextType)。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 将所有映射更改为使用 type="clob" 是个坏主意。首先,这会影响我们支持的所有其他数据库中的表——并且需要进行大量测试。其次,其他数据库中的字段可能会映射到更适合它们的另一种类型(不一定是 clob)。最后,这并不能解决问题——开始使用劣质类型有什么意义?
  • @mindas 向 Hibernate 开发人员提问。但是扩展方言似乎是你最好的选择(这真的与叉子无关)。
  • 感谢 Pascal,我提出了一个问题(也更新了这篇文章)。
  • @Mindas 感谢您发布此问题。打算关注这个。
【解决方案3】:

我无法回答你关于为什么的问题,但对于 Hibernate 6,似乎 they're considering switching back to using CLOB

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2013-07-10
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多