Исключение, когда не удается найти

#java #exception #jpa

Вопрос:

В чем причина того, чтобы бросать исключение в JPA, когда что-то не может быть найдено?
Добавлено: Такое поведение наблюдалось в EJB2 и было удалено из EJB3 — но… Это остается при вызове запроса#getSingleResult (), который создает исключение NoResultException.

Обычно я бы не ожидал, что это будет исключением, что что-то не может быть найдено. На самом деле это может быть ситуацией по умолчанию в некоторых случаях и, по крайней мере, ожидаемыми случаями в большинстве других ситуаций. Это заставляет меня вспомнить старую поговорку о том, что вы не должны использовать исключения как часть своей бизнес-логики, а только как то, что это такое, особые случаи, с которыми вы не знаете или не хотите иметь дело.

У кого-нибудь есть идея, почему это реализовано таким образом в JPA? В чем недостаток возврата null, когда что-то не удалось найти?

Ответ №1:

Вы вызываете getReference(класс, PrimaryKey)? Это вызовет исключение, если первичный ключ не существует; если вы хотите, чтобы возвращался нулевой объект, вместо этого используйте find(class, PrimaryKey). getReference() допускает отложенную загрузку, чего не делает find (), но побочный эффект этого заключается в том, что для разрешения отложенной загрузки вам необходимо ссылаться на реальный объект, а это означает, что вы должны передать действительный PK.