Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
@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.
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;
–
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.
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...
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.