Hibernate JPA, MySQL и TinyInt (1) для Boolean вместо бит или char
Вот мое определение JPA2/Hibernate:
Code:
@Column(nullable = false)
private boolean enabled;
В MySql этот столбец разрешен бит (1) типа данных - что не работает для меня. Для устаревших проблем мне нужно сопоставить логическое значение с tinyint, а не немного. Но я не вижу возможности изменить тип данных по умолчанию. Есть ли?
Ответы
Ответ 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 и другие подобные определения не дали результатов.