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

后端 未结 6 2111
感情败类
感情败类 2020-12-12 23:38

Here is my JPA2 / Hibernate definition:

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

In MySql this column is resolved to a bit(

相关标签:
6条回答
  • 2020-12-13 00:16

    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...

    0 讨论(0)
  • 2020-12-13 00:18

    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.

    0 讨论(0)
  • 2020-12-13 00:28

    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.

    0 讨论(0)
  • 2020-12-13 00:28

    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;
    
    0 讨论(0)
  • 2020-12-13 00:32

    @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;
    
    0 讨论(0)
  • 2020-12-13 00:41

    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.

    0 讨论(0)
提交回复
热议问题