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.
Esto ha sido respondido en una pregunta similar aquí:
Hibernate JPA, MySQL y TinyInt (1) para Boolean en lugar de bit o char
Su problema podría ser un poco más complicado ya que usa HSQL DB al mismo tiempo, ¡pero puede echarle un vistazo y probarlo de todos modos!
Pude resolver este problema agregando transformedBitIsBoolean=true
a mi cadena de conexión MySQL. Vea aquí: hibernate.atlassian.net/browse/HHH-6935
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