次のエラーが表示されます。
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>
Java エンティティには次のフィールドがあります。
private byte[] blob1;
...
@Basic(fetch = FetchType.LAZY)
@Lob
@Column(name = "blob1")
public byte[] getBlob1() {
return blob1;
}
データベースとして hsqldb 2.2.9 を使用し、JPA プロバイダーとして Hibernate 3.5.0-Final を使用しています。hsqldb の Hibernate 方言は次のとおりです。
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
liquibase がテーブルを生成するとき、liquibase HsqlTypeConverter は VARBINARY を SQL タイプとして使用する必要があります。Hibernate 検証スキームでは、タイプが blob(255) であると見なされ、VARBINARY と比較され、例外がスローされます。
テーブルを検証するコードは次のとおりです。
public void validateColumns(Dialect dialect, Mapping mapping, TableMetadata tableInfo) {
Iterator iter = getColumnIterator();
while ( iter.hasNext() ) {
Column col = (Column) iter.next();
ColumnMetadata columnInfo = tableInfo.getColumnMetadata( col.getName() );
if ( columnInfo == null ) {
throw new HibernateException( "Missing column: " + col.getName() + " in " + Table.qualify( tableInfo.getCatalog(), tableInfo.getSchema(), tableInfo.getName()));
}
else {
final boolean typesMatch = col.getSqlType( dialect, mapping ).toLowerCase()
.startsWith( columnInfo.getTypeName().toLowerCase() )
|| columnInfo.getTypeCode() == col.getSqlTypeCode( mapping );
if ( !typesMatch ) {
throw new HibernateException(
...
col.sqlType = blob(255)
デバッガーでは、いつ例外がスローされたかを確認できますcolumnInfo.typeName = VARBINARY
。col.getSqlType( dialect, mapping )
が呼び出されて col.sqlType を初期化すると、何らかの理由で blob(255) が取得されます。休止状態構成で hsqldb 方言を更新する必要があると思います。しかし、よくわかりません。問題を解決するために何をすべきかわかりません。