【问题标题】:Derby "A truncation error was encountered trying to shrink CLOB '<stream-value>' to length 255"Derby“尝试将 CLOB '<stream-value>' 缩小到 255 长度时遇到截断错误”
【发布时间】:2014-11-11 05:16:07
【问题描述】:

我的 JPA 实体中有一个列定义。

@Lob
String message;

当我尝试通过一些消息来持久化我的实体时出现以下错误。

原因:java.sql.SQLException:Java 异常:“尝试将 CLOB 缩小到 255 时遇到截断错误。:org.apache.derby.iapi.services.io.DerbyIOException”。

原因:org.apache.derby.iapi.services.io.DerbyIOException:尝试将 CLOB '' 缩小到 255 时遇到截断错误。

我在测试期间将 Hibernate 4.2.15.Final 与 Apache Derby 10.10.2 和模式生成一起使用。看起来列的长度限制为 255。如何克服这个错误?

【问题讨论】:

    标签: java hibernate jpa derby


    【解决方案1】:

    我遇到了同样的问题,这是我针对 hibernate-core-4.2.7Derby 的解决方案:

    如果您创建一个字符串列,它们将变为 VARCHAR(255)

    @Column()
        private String userName;
    

    但是您可以增加长度,例如通过执行以下操作增加到 1000 个字符:

    @Column(length = 1000)
       private String description;
    

    PS:我不得不删除/删除我的旧表以强制创建一个具有正确大小的新表,还请查看 @Column 界面内部,那里有一些有用的东西,例如独特的、可使用的, 可更新

    【讨论】:

      【解决方案2】:

      这被认为是 Hibernate https://hibernate.atlassian.net/browse/HHH-7264https://hibernate.atlassian.net/browse/HHH-1501 中的一个错误,但它不会像看起来那样被修复。

      Hibernate 不考虑长度/比例/精度,也不考虑 确定用于属性的休眠类型时的方言 其中省略了指定一个。它的作用基本上是选择一个 默认仅基于 Java 类型

      所有 Derby 方言 (DB2Dialect) 的基类都是这样做的:

      registerColumnType( Types.CLOB, "clob($l)" );
      

      您可以挂钩声明一个 Hibernate DialectResolver,它执行以下操作:

      private class DerbyTenSevenDialectWithClob extends DerbyTenSevenDialect {
          public DerbyTenSevenDialectWithClob() {
              super();
              registerColumnType( Types.CLOB, "clob" );
          }
      }
      

      我刚刚验证了使用 Hibernate 5.3.7 和 Derby 10.12.1.1

      【讨论】:

        【解决方案3】:

        Hibernate 中的 Derby 方言生成长度有限的列定义:

        message clob(255)
        

        您可能希望覆盖此行为并设置自己的长度或保留默认长度。你可以使用

        @Column(columnDefinition="clob")
        @Lob
        String message;
        

        记住在德比中

        没有指定长度的 CLOB 默认为 2 GB (2,147,483,647)

        【讨论】:

        • 这样说听起来好像每个 CLOB 占用了 2GB。事实并非如此。限制为 2GB,但您可以在不浪费空间的情况下存储小块。所以 Hibernate 中的 255 默认限制看起来很奇怪......
        • 与上面一样 @Column(columnDefinition="clob",length=6000) 仍然是相同的消息?
        猜你喜欢
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        • 2021-08-26
        • 1970-01-01
        • 2022-10-16
        • 1970-01-01
        • 2019-10-07
        • 2021-02-28
        相关资源
        最近更新 更多