Java blob sql类型的Hibernate验证问题
我得到以下错误:Java blob sql类型的Hibernate验证问题,java,hibernate,validation,hsqldb,liquibase,Java,Hibernate,Validation,Hsqldb,Liquibase,我得到以下错误: Caused by: org.hibernate.HibernateException: Wrong column type in PUBLIC.PUBLIC.ALL_TYPES_ENTITIES for column blob1. Found: varbinary, expected: blob(255) at org.hibernate.mapping.Table.validateColumns(Table.java:383) 我正在使用liquibase创建表:
Caused by: org.hibernate.HibernateException: Wrong column type in PUBLIC.PUBLIC.ALL_TYPES_ENTITIES for column blob1. Found: varbinary, expected: blob(255)
at org.hibernate.mapping.Table.validateColumns(Table.java:383)
我正在使用liquibase创建表:
<column name="blob1" type="BLOB">
<constraints nullable="true"/>
</column>
我使用HSQLDB2.2.9作为数据库,使用Hibernate3.5.0-Final作为JPA提供程序。hsqldb的Hibernate方言为:
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
在调试器中,我可以看到抛出异常时,col.sqlType=blob(255)
,columnifo.typeName=VARBINARY
。出于某种原因,当调用col.getSqlType(方言,映射)
初始化col.sqlType时,它会得到blob(255)。
我想我应该在hibernate配置中更新hsqldb方言。但不确定。
我不知道该怎么解决这个问题 您在验证查询中得到的是
255
,因为它是@Column
注释的length
属性的默认值
由于HSQLDB同时支持VARBINARY
和BLOB
,显然Hibernate使用BLOB
作为byte[]
列的默认SQL映射
通过指定@Column
的columnDefinition
属性,可以明确告诉Hibernate使用VARBINARY
:
@Basic(fetch = FetchType.LAZY)
@Lob
@Column(name = "blob1", columnDefinition = "VARBINARY")
public byte[] getBlob1() {
return blob1;
}
请注意,如前所述,列定义可以通过显式指定其长度来更改,但通常它与
String
列相关。Liquibase不对自2.0版以来在hsqldb中可用的BLOB使用sql BLOB type。
在HSQLDB1.8.X中,用于blob的sql类型是:varbinary。
为了解决这个问题,我更新了hibernate中使用的hsqldb方言:
public class HSQL_1_8_X_Dialect extends HSQLDialect {
public HSQL_1_8_X_Dialect() {
super();
registerColumnType(Types.BLOB, "varbinary");
registerColumnType(Types.CLOB, "varchar");
}
}
<property name="hibernate.dialect" value="com.savdev.datasource.dialect.HSQL_1_8_X_Dialect"/>
公共类HSQL_1_8_X_方言扩展了HSQL方言{
公共HSQL_1_8_X_方言(){
超级();
registerColumnType(Types.BLOB,“varbinary”);
registerColumnType(Types.CLOB,“varchar”);
}
}
它解决了这个问题。此外,我认为liquibase应该更新当前的
HsqlTypeConverter
,或者添加支持hsqldb2.X版本的新转换器。但是如果我稍后将hsqldb更改为支持blob as VARBINARY(MAX)的ms sql server,那么我就必须更改列attibute。我能对这个问题做些什么吗?我不认为模型更新是更改数据库服务器时的最佳选择。问题是,您使用liquibase
创建数据库,但使用Hibernate
进行验证。在这种情况下,您必须确保liquibase
创建了Hibernate所期望的类型,反之亦然-确保Hibernates所期望的类型是由liquibase创建的。为了创建与DB平台无关的所有内容,我允许Hibernate自己创建所有表/字段(即,hbm2ddl=update
)。然后,也许您可以告诉我如何使liquibase创建表,以便Hibernate对其进行验证?以独立于数据库平台的方式。一旦我设置了columnDefinition,我就完全删除了DB平台独立性。我不确定,但您可能应该尝试使用Liquibase。如果它没有帮助,那么你可能会认为这是一个LyQueBiHibernate的bug。
@Basic(fetch = FetchType.LAZY)
@Lob
@Column(name = "blob1", columnDefinition = "VARBINARY")
public byte[] getBlob1() {
return blob1;
}
public class HSQL_1_8_X_Dialect extends HSQLDialect {
public HSQL_1_8_X_Dialect() {
super();
registerColumnType(Types.BLOB, "varbinary");
registerColumnType(Types.CLOB, "varchar");
}
}
<property name="hibernate.dialect" value="com.savdev.datasource.dialect.HSQL_1_8_X_Dialect"/>