Я получаю следующую ошибку при использовании примитивного атрибута в моем объекте домена grails:
Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1077)
Ответы:
Согласно этому потоку SO , решение состоит в использовании непримитивных типов оболочки; например,
Integer
вместоint
.источник
Нулевое значение не может быть присвоено примитивному типу, например int, long, boolean и т. Д. Если столбец базы данных, соответствующий полю в вашем объекте, может иметь значение NULL, тогда ваше поле должно быть классом-оболочкой, например Integer, Long, Булево и т. Д.
Опасность заключается в том, что ваш код будет работать нормально, если в БД нет нулей, но не удастся, когда они будут вставлены.
И вы всегда можете вернуть примитивный тип из геттера. Пример:
Но в большинстве случаев вы захотите вернуть класс-оболочку.
Поэтому либо настройте столбец БД, чтобы не допускать нулей, либо используйте класс-оболочку.
источник
Примитивный тип не может быть нулевым. Таким образом, решение заключается в замене примитивного типа на примитивный класс-оболочку в вашем файле tableName.java. Такие как:
ссылка http://en.wikipedia.org/wiki/Primitive_wrapper_class найти обертку классу primivite типа.
источник
Я постараюсь объяснить вам это на примере. Предположим, у вас есть реляционная таблица (STUDENT) с двумя столбцами и ID (int) и NAME (String). Теперь, как ORM, вы бы сделали класс сущности примерно следующим образом:
Предположим, в таблице уже были записи. Теперь, если кто-то попросит вас добавить еще один столбец «ВОЗРАСТ» (int)
Вам нужно будет установить значения по умолчанию как NULL, чтобы добавить еще один столбец в предварительно заполненную таблицу. Это заставляет вас добавить еще одно поле в класс. Теперь возникает вопрос, будете ли вы использовать примитивный тип данных или непримитивный тип данных-оболочку для объявления поля.
или
вам придется объявить поле как непримитивный тип данных оболочки, потому что контейнер будет пытаться сопоставить таблицу с сущностью. Следовательно, он не сможет отобразить значения NULL (по умолчанию), если вы не объявите поле как оболочку, и в конечном итоге выдаст исключение «Нулевое значение было присвоено свойству установщика примитивного типа».
источник
используйте Integer в качестве типа и соответственно укажите сеттер / получатель.
источник
Не используйте примитивы в своих классах Entity , используйте вместо них соответствующие обертки. Это решит эту проблему.
Вне своих классов Entity вы можете использовать проверку! = Null для остальной части потока кода.
источник
Либо полностью избегайте использования
null
DB черезNOT NULL
и в сущности Hibernate через@Column(nullable = false)
соответственно, либо используйтеLong
оболочку вместоlong
примитивов.Примитив не является объектом, поэтому вы не можете присвоить
null
ему значение.источник
Есть два пути
null
private int var;
могут быть инициализированы какprivate Integer var;
источник
@Dinh Nhat, ваш метод установки выглядит неправильно, потому что вы снова помещаете туда примитивный тип, и он должен быть:
источник
Измените тип параметра с примитивного на Object и установите нулевую отметку в установщике. См. Пример ниже
источник
Изменить на
источник
Убедитесь, что поле myAttribute вашей базы данных содержит ноль вместо нуля.
источник