"Найдено: бит, ожидаемый: 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.
Ответы
Ответ 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, но вы можете взглянуть и попробовать в любом случае!