Java “德比”;试图收缩CLOB';时遇到截断错误&书信电报;流量价值>';至长度255“;
我的JPA实体中有一个列定义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“”收缩到
@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;