Hibernate JPA, MySQL и TinyInt (1) для логического значения вместо бита или символа - PullRequest
41 голосов
/ 01 августа 2010

Вот мое определение JPA2 / Hibernate:

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

В MySql этот столбец преобразован в битовый (1) тип данных - что у меня не работает. Для устаревших проблем мне нужно сопоставить логическое значение с tinyint, а не немного. Но я не вижу возможности изменить тип данных по умолчанию. Есть ли?

Ответы [ 5 ]

59 голосов
/ 19 апреля 2012

@ Тип аннотации является аннотацией Hibernate.

В полном JPA2 (с Hibernate 3.6 + ) способ сопоставления логического поля типу SQL TINYINT (1) вместо BIT (1) заключается в использовании атрибута columnDefinition.

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

nb: длина атрибута в этом случае, похоже, не действует, тогда мы используем (1) синтаксис.


С Hibernate 4.0 + , этот вид синтаксиса может вызвать ошибку времени выполнения, такую ​​как:

Wrong column type Found: bit, expected: TINYINT(1)

Похоже, что в этом случае ваш единственный способ - использовать tinyInt1isBit = false в строке подключения к источнику данных MySQL, например:

jdbc:mysql://server_host:3306/database?tinyInt1isBit=false

Кстати, теперь вы можете использовать атрибут длины следующим образом:

@Column(nullable = false, columnDefinition = "TINYINT", length = 1)
private boolean enabled;
37 голосов
/ 01 августа 2010

Попробуйте NumericBooleanType. По некоторым причинам это не имеет объявленного короткого имени типа, поэтому вам придется использовать:

@Column(nullable = false)
@Type(type = "org.hibernate.type.NumericBooleanType")
private boolean enabled;

Это соответствует типу INTEGER, но, вероятно, будет хорошо работать с TINYINT.

ОБНОВЛЕНИЕ: org.hibernate.type.NumericBooleanType Работает ли не с TINYINT в некоторых СУБД. Переключите тип столбца базы данных на INTEGER. Или используйте другое значение Java @Type или columnDefinition, в зависимости от ситуации.

В этом примере ответ Чувака на @Column(nullable = false, columnDefinition = "TINYINT(1)") будет работать без каких-либо изменений в базе данных.

2 голосов
/ 26 ноября 2017

Я использую JPA с Spring Data / Hibernate 5.0 для базы данных MySQL.

В объекте Entity я поместил следующее:

@Column(name = "column_name", columnDefinition = "BOOLEAN")
private Boolean variableName;

В моей среде dev есть hibernate auto-ddl, настроенный на обновление, поэтому при развертывании в dev была создана таблица с именем column_name типа tinyint (1).

В моем коде, использующем этот столбец, значение null рассматривается как ложное, поэтому я не беспокоюсь о значениях null, если вы это сделаете, вы можете сделать его примитивным логическим значением или добавить ", nullable = false" к аннотации столбца.

Это решение полностью JPA (не использует аннотацию типа Hibernate) и не требует изменения строки подключения.

1 голос
/ 06 августа 2015

У меня была эта ошибка:

Причина: org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем 'sessionFactory', определенным в ресурсе ServletContext [/ WEB-INF / config /context-config.xml]: сбой вызова метода init;вложенным исключением является org.hibernate.MappingException: не удалось определить тип для: org.hibernate.type.NumericBooleanType, в таблице: bookingItem, для столбцов: [org.hibernate.mapping.Column (enabled)] * ​​1004 *

И это сработало для меня:

@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean enabled;
0 голосов
/ 16 апреля 2019

При использовании Microsoft sql и некоторых версий mysql используйте следующее:

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

Для меня: tinybit, boolean и другие подобные определения не удаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...