Подтвердить что ты не робот

Hibernate JPA, MySQL и TinyInt (1) для Boolean вместо бит или char

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

аннотация @Type представляет собой аннотацию Hibernate.

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

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

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


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

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

В моей среде Dev установлен hibernate auto-ddl для обновления, поэтому, когда я развернулся в dev, он создал таблицу с именем_ column_ типа tinyint (1).

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

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

Ответ 5

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

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

Для меня tinybit, boolean и другие подобные определения не дали результатов.