Я нашел очень странное поведение в нашем приложении grails сегодня, которое хочу поделиться с вами.Grails findById (null) возвращающий «случайный» результат
Мы используем grails 2.3.11 на mysql 5.1.48.
У нас был DomainObject.findById(id)
в одном из ваших действий с контроллером. Нам не удалось проверить идентификатор для нулевого значения, поэтому DomainObject.findById(null)
будет вызываться, если в качестве аргумента не передается id.
Обычно DomainObject.findById(null)
возвратит null, но есть особое условие, которое даст другие результаты!
Если действия контроллера называется до этого вставили новую запись в базе данных (назовём это объект B), независимо от объекта домена хранится, то DomainObject.findById(null)
найдет DomainObject с тем же идентификатором объекта B получил на вставить.
Итак, когда действие контроллера вызывается перед сохранением чего-либо, findById(null)
вернет строку. И эта строка будет иметь тот же идентификатор, что и последний вставленный элемент.
Я полностью осознаю, что использование findById(null)
- это не желаемый способ сделать это, но я был очень шокирован результатами, которые он дал. Но возвращение какого-либо кажущегося «случайного» результата кажется мне очень странным.
Я также хочу отметить, что DomainObject.get(null)
не пострадает от этой проблемы.
Кто-нибудь еще был свидетелем этого?
Существует активная Джира, указывающая в этом направлении: https://jira.grails.org/browse/GRAILS-9628, но это не описывает эту проблему.
Когда я увидел этот вопрос и протестировал его в одном из моих приложений, запрос был «правильно» отправлен в базу данных как «id is null» - я согласен, что это лучше быть явным и проверять значение null в коде, но почему GORM иногда обрабатывает это, а иногда и нет? Это зависит от конкретного драйвера базы данных? Hibernate/GORM версия? –
ty для наблюдения. Я знаю, что отчасти это я виноват, я был просто озадачен результатами. Я предполагаю, что не должно быть слишком сложно обрабатывать findByXXX (null) как findByXXXIsNull, потому что это то, что люди ожидают. У меня не было времени проверить его с помощью разных баз данных, но я могу подтвердить, что такой же ошибки не происходит, когда мы развертываем наше приложение на сервере с помощью maria-db. Возможно, это связано с окружающей средой разработки. – Oliver
@Oliver У вас есть вопрос или «Кто-нибудь еще был свидетелем этого?» действительно ли это? –