Подтвердить что ты не робот

"Найдено: бит, ожидаемый: boolean" после обновления Hibernate 4

Я пытаюсь выполнить обновление с 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.

4b9b3361

Ответ 1

Я справился с этим, добавив 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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

в BooleanType в спящем режиме 4 они сменили Ctor на

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

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

public BooleanType() {
    this( BitTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
}

Ответ 5

На этот вопрос ответили аналогичным вопросом:

Hibernate JPA, MySQL и TinyInt (1) для Boolean вместо бит или char

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