Hibernate JPA, MySQL and TinyInt(1) for Boolean instead of bit or char

JavaMysqlHibernateJpaJpa 2.0

Java Problem Overview


Here is my JPA2 / Hibernate definition:

Code:
@Column(nullable = false)
private boolean enabled;

In MySql this column is resolved to a bit(1) datatype - which does not work for me. For legacy issues I need to map the boolean to a tinyint not to a bit. But I do not see a possibility to change the default datatype. Is there any?

Java Solutions


Solution 1 - Java

@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;

Solution 2 - Java

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.

Solution 3 - Java

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.

Solution 4 - Java

I had this error:

> Caused by: org.springframework.beans.factory.BeanCreationException: > Error creating bean with name 'sessionFactory' defined in > ServletContext resource [/WEB-INF/config/context-config.xml]: > Invocation of init method failed; nested exception is > org.hibernate.MappingException: Could not determine type for: > org.hibernate.type.NumericBooleanType, at table: bookingItem, for > columns: [org.hibernate.mapping.Column(enabled)]

And this worked for me:

@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean enabled;

Solution 5 - Java

When using Microsoft sql and some versions of mysql use the following:

@Column(name = "eanbled", columnDefinition = "bit default 0", nullable = false)
private boolean enabled;

For me, tinybit, boolean, and other such definitions failed.

Solution 6 - Java

Old question but probably will save someone's time.

I am using Spring Data JPA 2.2.5. I had a similar issue when I work with MySQL and MariadDB parallelly with the same code base. It worked on one and didn't on another.

The issue was, I was creating the field as unsigned.

I moved the below SQL part from

`is_fixed` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',

to the below

`is_fixed` TINYINT(1) NOT NULL DEFAULT '0',

this fixed the issue and was working in both Mysql and MariaDB without any issue...

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTa SasView Question on Stackoverflow
Solution 1 - JavaDonatelloView Answer on Stackoverflow
Solution 2 - JavaMike QView Answer on Stackoverflow
Solution 3 - JavaAnnulet ConsultingView Answer on Stackoverflow
Solution 4 - JavamarioarranzrView Answer on Stackoverflow
Solution 5 - JavaNoxView Answer on Stackoverflow
Solution 6 - JavaBlueBirdView Answer on Stackoverflow