Я получаю следующую ошибку:
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 в качестве базы данных и Hibernate 3.5.0-Final в качестве поставщика JPA. Диалект Hibernate для hsqldb:
<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 в конфигурации спящего режима. Но не уверен. Не знаю, что мне делать, чтобы решить проблему.