Java “德比”;试图收缩CLOB';时遇到截断错误&书信电报;流量价值>';至长度255“;

Java “德比”;试图收缩CLOB';时遇到截断错误&书信电报;流量价值>';至长度255“;,java,hibernate,jpa,derby,Java,Hibernate,Jpa,Derby,我的JPA实体中有一个列定义 @Lob String message; 当我试图用一些消息持久化实体时,出现以下错误 原因:java.sql.SQLException:java exception:“试图将CLOB“”压缩到长度255时遇到截断错误。:org.apache.derby.iapi.services.io.DerbyIOException” 由以下原因引起:org.apache.derby.iapi.services.io.DerbyIOException:尝试将CLOB“”收缩到

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

@Lob
String message;
当我试图用一些消息持久化实体时,出现以下错误

原因:java.sql.SQLException:java exception:“试图将CLOB“”压缩到长度255时遇到截断错误。:org.apache.derby.iapi.services.io.DerbyIOException”

由以下原因引起:org.apache.derby.iapi.services.io.DerbyIOException:尝试将CLOB“”收缩到长度255时遇到截断错误


我将Hibernate4.2.15.Final与ApacheDerby10.10.2一起使用,并在测试期间生成模式。看起来该列的长度限制为255。如何克服此错误?

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

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

@Column(columnDefinition="clob")
@Lob
String message;
记得在德比的时候吗

没有指定长度的CLOB默认为2 GB(2147483647)


这被认为是Hibernate中的一个bug,但它不会像看上去那样被修复

Hibernate不考虑长度/比例/精度,也不考虑 确定要用于属性的休眠类型时使用的方言 没有具体说明。它所做的基本上是选择一个 默认值仅基于Java类型

所有Derby方言的基类(DB2Dialect)都执行以下操作:

registerColumnType( Types.CLOB, "clob($l)" );
您可以钩子声明一个Hibernate方言解析程序,它执行以下操作:

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

我刚刚验证了使用Hibernate 5.3.7和Derby 10.12.1.1时,我遇到了相同的问题,下面是我对Hibernate-core-4.2.7和Derby的解决方案:

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

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

@Column(length = 1000)
   private String description;

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

这样放置,听起来好像每个CLOB占用2GB。事实并非如此。限制为2GB,但您可以在不浪费空间的情况下存储小型CLOB。所以Hibernate中的255默认限制看起来很奇怪。。。
@Column(length = 1000)
   private String description;