«Найдено: бит, ожидается: логическое» после обновления Hibernate 4 - PullRequest
32 голосов
/ 29 декабря 2011

Я пытаюсь обновить Hibernate 3.6.5 до 4.0 (и с Spring 3.0.5 до 3.1, что требуется для поддержки Hibernate 4).

Теперь, с MySQL и HSQL, я сталкиваюсь с этой проблемой с постоянными логическими полями:

Caused by: org.hibernate.HibernateException: 
Wrong column type in PUBLIC.PUBLIC.EVENT for column Checked. Found: bit, expected: boolean
    at org.hibernate.mapping.Table.validateColumns(Table.java:282)
    at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1268)
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:155)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:453)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1775)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:184)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:314)

JPA @Entity и @Column аннотации используются в объектах домена, а проблемные поля выглядят так:

@Column(name = "Checked")
private boolean checked;

Схема HSQL:

Checked bit default 0 not null,

Схема MySQL:

`Checked` tinyint(1) NOT NULL default '0',

Какой самый простой способ решить эту проблему, придерживаясь Hibernate 4 ? Стоит ли менять схему базы данных, конфиги Hibernate или аннотации классов домена?

Понятия не имею, если код и конфигурация были полностью "правильными" раньше, но по крайней мере он работал нормально с Hibernate 3.

Ответы [ 5 ]

45 голосов
/ 27 марта 2012

Я решил это, добавив columnDefinition = "BIT" в строку @Column.

@Basic
@Column(name = "B", columnDefinition = "BIT", length = 1)
public boolean isB() {
    return b;
}

Он также определен как «BIT (1)» в БД. Также работал с TINYINT. Это самое простое решение, которое я нашел, так как изменение является супер-второстепенным и не нужно трогать БД.

Использование: MySQL Server 5.5.13, Hibernate 4.1.1, JDK 1.6

19 голосов
/ 17 января 2012

У меня была та же проблема, и я расширил диалект, чтобы учесть тот факт, что mysql рассматривает логическое значение как псевдоним бита.

public class Mysql5BitBooleanDialect extends MySQL5Dialect{     
    public Mysql5BitBooleanDialect() {
        super();
        registerColumnType( java.sql.Types.BOOLEAN, "bit" );        
    }       
}

Я не использую более длинные поля bit () (например, для представления байта []), так что это может нарушить это.

8 голосов
/ 05 марта 2014

Мне удалось решить эту проблему, добавив transformedBitIsBoolean=true в строку подключения MySQL. Смотрите здесь: https://hibernate.atlassian.net/browse/HHH-6935

0 голосов
/ 05 декабря 2014

На этот же вопрос ответили здесь:

Hibernate JPA, MySQL и TinyInt (1) для логического значения вместо бита или символа

Ваша проблема можетбыть немного сложнее, так как вы одновременно используете HSQL DB, но вы все равно можете посмотреть и попробовать!

0 голосов
/ 04 января 2012

Нашел проблему я также получил org.hibernate.HibernateException: неправильный тип столбца ... Найдено: бит, ожидается: логическое

на BooleanType в hibernate 4 они изменили Ctor на

public BooleanType() {
    this( org.hibernate.type.descriptor.sql.BooleanTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
}

вместо старых версий

public BooleanType() {
    this( BitTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...