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"/>