java mysql hibernate hsqldb hibernate-4.x

java - "Found: bit, expected: boolean" después de la actualización de Hibernate 4



mysql hsqldb (5)

Encontré el problema también obtuve org.hibernate.HibernateException: tipo de columna incorrecta ... Encontrado: bit, expected: boolean

en BooleanType en hibernación 4 cambiaron el Ctor a

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

en lugar de versiones antiguas

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

Estoy intentando actualizar de Hibernate 3.6.5 a 4.0 (y desde Spring 3.0.5 a 3.1, que es necesario para la compatibilidad con Hibernate 4).

Ahora, con MySQL y HSQL, me encuentro con este problema con campos booleanos persistentes:

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)

@Column anotaciones JPA @Entity y @Column se utilizan en objetos de dominio, y los campos problemáticos se ven así:

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

Esquema HSQL:

Checked bit default 0 not null,

Esquema de MySQL:

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

¿Cuál es la forma más directa de resolver esto mientras se mantiene con Hibernate 4 ? ¿Debo cambiar el esquema de la base de datos, las configuraciones de Hibernate o las anotaciones de la clase de dominio?

No tengo idea si el código y la configuración eran completamente "correctos" antes, pero al menos funcionaban bien con Hibernate 3.




Tuve el mismo problema y extendí el Dialecto para tener en cuenta el hecho de que mysql trata a boolean como un alias de bit.

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

No uso los campos bit () más largos (para representar por ejemplo byte []) así que esto podría romper eso.


columnDefinition = "BIT" esto agregando columnDefinition = "BIT" a la línea @Column.

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

Se define como ''BIT (1)'' en la BD también. También trabajé con TINYINT. Esta es la solución más fácil que he encontrado ya que el cambio es súper menor y no es necesario tocar el DB.

Usando: MySQL Server 5.5.13, Hibernate 4.1.1, JDK 1.6