Hibernate JPA, MySQL and TinyInt(1) for Boolean instead of bit or char
@Type annotation is an Hibernate annotation.
In full JPA2 (with Hibernate 3.6+), the way to map a Boolean field to a TINYINT(1) SQL type instead of BIT(1), is to use the columnDefinition attribute.
@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean enabled;
nb: length attribute seems to have no effect in this case, then we use (1) syntax.
With Hibernate 4.0+, this kind of syntax can cause an runtime error like this :
Wrong column type Found: bit, expected: TINYINT(1)
It seems that in this case, your only way is to use tinyInt1isBit=false in the MySQL datasource connection string like this :
jdbc:mysql://server_host:3306/database?tinyInt1isBit=false
By the way, you can now use the length attribute like this :
@Column(nullable = false, columnDefinition = "TINYINT", length = 1)
private boolean enabled;
Try the NumericBooleanType
. For some reason this doesn't have a declared short type name so you'd have to use:
@Column(nullable = false)
@Type(type = "org.hibernate.type.NumericBooleanType")
private boolean enabled;
This does map to an INTEGER type but it will probably work fine with a TINYINT.
UPDATE: org.hibernate.type.NumericBooleanType
Does not work with TINYINT in some RDBMS. Switch the database column type to INTEGER. Or use a different Java @Type value, or columnDefinition, as appropriate.
In this example, Dude's answer of @Column(nullable = false, columnDefinition = "TINYINT(1)")
would work without any database changes.
I'm using JPA with Spring Data/Hibernate 5.0 on a MySQL database.
In my Entity object, I put the following:
@Column(name = "column_name", columnDefinition = "BOOLEAN")
private Boolean variableName;
My dev environment has hibernate auto-ddl set to update, so when I deployed to dev, it created the table with column_name of type tinyint(1).
My code that uses this column considers null as false, so I'm not worried about nulls, if you are, you could make it a primitive boolean or add ", nullable = false" to the Column annotation.
This solution is fully JPA (doesn't use hibernate Type annotation) and requires no change to the connection string.