2011-12-29 4 views
32

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)."Encontrado: bit, expected: boolean" después de la actualización de Hibernate 4

Ahora, con tanto MySQL y HSQL, estoy corriendo en este problema con persistentes campos booleanos:

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) 

APP @Entity y @Column anotaciones se utilizan en objetos de dominio, y los campos problemáticos tener este aspecto: esquema

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

HSQL:

Checked bit default 0 not null, 

MySQL esquema:

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

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

tengo ni idea de si el código y configuración fue totalmente "correcta" antes, pero al menos funcionó bien con Hibernate 3.

+0

Con HSQL, cambiar "bit" a "booleano" en el archivo de esquema * parece * ayudar (es decir, luego me encuentro con un problema diferente de Hibernate 4). Sin embargo, eso es un poco extraño, ya que [la documentación de HSQL] (http://hsqldb.org/doc/guide/ch09.html#datatypes-section) da la impresión de que BOOLEAN y BIT son equivalentes. – Jonik

Respuesta

43

Lo resolví 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 base de datos 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.

usar: MySQL Server 5.5.13, Hibernate 4.1.1, JDK 1.6

+1

Ya no es necesario en Hibernate versión 4.3.0+ – Ishmael

0

encontrado el problema También me org.hibernate.HibernateException: incorrecto tipo de columna ... encontrado: poco, se esperaba: booleano

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 las versiones antiguas

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

Um, ¿cuál es la solución? Citando mi pregunta: "¿Cuál es la forma más directa de resolver esto mientras sigo con Hibernate 4? ¿Debo cambiar el esquema de la base de datos, las configuraciones de Hibernate o las anotaciones de la clase de dominio?" – Jonik

+0

@Jonik: ¿lo resolvió? Tengo el mismo problema. –

19

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 consumo ya poco() Campos (para representar, por ejemplo, byte []) así que esto podría romper eso.

+2

Esto parece (otro) gran descuido relacionado con el tipo en el dialecto MySQL de Hibernate. Dejé de actualizar cuando se lanzó 4.0 y me sorprende que no se haya abordado un año después. Pero gracias por el consejo. Extender el dialecto y actualizar persistence.xml parece mucho mejor que agregar un columnDefinition cada vez que anoto un campo booleano. Estoy usando Hibernate como una implementación de JPA y quiero mantener los bits de no configuración tan neutrales a la implementación como sea posible. – spaaarky21

+1

Sin embargo, 6 meses después, el problema sigue ahí. Lo peor es que el esquema generado por hibernate2ddl usa boolean con MySQL. Por lo tanto, el esquema generado por Hibernate no puede ser validado por Hibernate :( –

+2

Por último debe ser corregido en la próxima versión (4.3.0): https://hibernate.atlassian.net/browse/HHH-6935 – TahitianGabriel

7

que era capaz de resolver este problema agregando transformedBitIsBoolean=true a mi cadena de conexión MySQL. Ver aquí: https://hibernate.atlassian.net/browse/HHH-6935

+0

esto es mucho mejor que codificar como bit :-) – Atais

+1

Funcionó para mí (Hibernate 4.1.x). Porque al principio no era obvio lo que se quiere decir aquí: En persistence.xml: opncow

Cuestiones relacionadas