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

Невозможно установить boolean в null

У меня есть класс Shop со следующей переменной

@Column(columnDefinition = "bit")
private boolean atShop;

Используя это значение, я использую HSQL для извлечения этой информации из приложения

from Person person
left join fetch person.shop

когда я пытаюсь вызвать этот оператор HSQL, я получаю следующую ошибку:

org.springframework.orm.hibernate3.HibernateSystemException: could not set a field value by reflection setter of com.test.dataobject.Shop.atShop; nested exception is org.hibernate.PropertyAccessException: could not set a field value by reflection setter of com.test.dataobject.Shop.atShop

Это бросает это, потому что он пытается установить логическое значение null в HSQL. Я могу решить эту проблему, изменив private boolean atShop; на private boolean atShop;, но я хочу сохранить это как boolean, поскольку я сохраняю его как бит в моей базе данных

Есть ли способ решить это, не меняя boolean на boolean?

EDIT:

Я знаю, что boolean может быть только true/false, а Boolean может быть установлен в null, но есть ли способ получить hibernate/ spring, чтобы установить это значение в значение false (которое, как я думал, оно должно делать автоматически) вместо пытаясь установить его в null и выбросить это исключение?

Я также попробовал добавить аннотацию, чтобы автоматически установить значение в false, но это не работает.

@Column(nullable = false, columnDefinition = "bit default 0")
private boolean atShop;
4b9b3361

Ответ 1

- boolean является примитивным типом и может иметь значение только true or false.

- В то время как boolean является Wrapper Object и ему может быть присвоено значение null.

- Предоставляется Java 1.5 AutoBoxing, поэтому вы можете конвертировать boolean в Boolean и возвращаться к логическому оператору с простым оператором присваивания (=), поэтому вы можете сделать это в тех местах, где вы хотите булевых, а не логических.

Ответ 2

Вместо того, чтобы возиться со спящим кодом, измените определение таблицы на значения по умолчанию на значение false (или 0). Таким образом, когда вы приходите к чтению из базы данных, он всегда будет иметь допустимые значения (что, поскольку оно логическое, имеет больше смысла)

Ответ 3

null не совпадает с false (и не совпадает с true). null имеет очень специфическое значение. Вот почему Hibernate делает то, что он делает... потому что это действительно единственное, что имеет смысл, несмотря на то, что вы думаете, что он должен делать.

Если вы хотите проинструктировать Hibernate относиться к null в этих столбцах как false, единственным реальным решением является разработка настраиваемого сопоставления типа Hibernate для этого специального обращения с "null", на самом деле это не нуль. Это можно сделать либо путем реализации интерфейса org.hibernate.type.Type, либо интерфейса org.hibernate.usertype.UserType. Лучше всего расширить стандартное булевское сопоставление типов и переплетать специальную обработку нулей.

Однако нужно быть осторожным, так как проверка равенства с null никогда не действительна в ANSI SQL. Он решает, что SQL вызывает UNDEFINED, что обычно означает false.

Ответ 4

boolean является примитивным, он может быть true или false, а по умолчанию - false. Чтобы получить null, тип объекта boolean.

Ответ 5

Вы знаете, что можете просто попытаться поймать его, если он выдает исключение, которое означает, что оно равно null, поэтому установите его в false.