Derby“尝试将CLOB'<stream-value>'缩小到255”时遇到截断错误</stream-value>

时间:2014-09-17 08:43:53

标签: java hibernate jpa derby

我的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.如何克服此错误?

3 个答案:

答案 0 :(得分:5)

Hibernate中的Derby方言生成具有有限legth的列定义:

message clob(255)

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

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

请记住,在德比中

  

没有指定长度的CLOB默认为2千兆字节(2,147,483,647)

答案 1 :(得分:0)

这在Hibernate https://hibernate.atlassian.net/browse/HHH-7264https://hibernate.atlassian.net/browse/HHH-1501中被视为错误,但看上去并不会得到解决。

  

休眠模式不考虑长度/比例/精度   确定属性使用的休眠类型时的方言   省略了指定一个。它的作用是基本上选择一个   默认仅基于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

答案 2 :(得分:0)

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

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

@Column()
    private String userName;

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

@Column(length = 1000)
   private String description;

PS:我不得不删除/删除旧表以强制创建具有正确大小的新表,还需要在 @Column 界面中进行查看,其中有一些有用的东西,例如唯一,可修改,可更新