Mapping a boolean with hibernate

Terraego picture Terraego · May 31, 2011 · Viewed 36.8k times · Source

I'm running into trouble with hibernate. I recently set my hbm2ddl to validate, and it has been complaining a lot about wrong datatypes. I have fixed every problem except for booleans.

I have a field opener in my class, which is mapped as:

<property column="opener" name="opener" type="boolean"/>

The column opener is a tinyint (4) and has a value of 1 or 0. So far I've tried changing the types, but to no avail. I have also tried using the following setting in my hibernate.cfg:

<property name="hibernate.query.substitutions">true 1, false 0</property>

But I am still getting the same error. What am I doing wrong?

org.hibernate.HibernateException: Wrong column type: opener, expected: bit
    at org.hibernate.mapping.Table.validateColumns(Table.java:261)
    at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1083)
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:116)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:317)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)

note: I have no access to the database.

Answer

EricParis16 picture EricParis16 · Jun 1, 2011

If you can't change your SQL type in your table, i recommend you to do this :

<property name="opener" column="opener" type="path.to.your.package.YourClassUserType"/>

and create your class :

import org.hibernate.usertype.UserType;

public class YourClassUserType implements UserType{
 ...
}

you have to implement methods from the interface UserType. The implementation will transform byte to boolean (because a TINYINT is mapped in byte in Java)

see examples here

good luck :)