Исключение JDBC SQL против исключения Hibernate (исключение JDBC) - PullRequest
0 голосов
/ 03 декабря 2018

В настоящее время я учусь кодировать в спящем режиме и перебираю некоторые блоги. Я наткнулся на следующую строку, которая гласит - "JDBC API throws SQLException that is a checked exception, so we need to write a lot of try-catch block code. Most of the times it’s redundant in every JDBC call and used for transaction management. Hibernate wraps JDBC exceptions and throw JDBCException or HibernateException un-checked exception, so we don’t need to write code to handle it. "

Я знаю, что исключение SQL - это время компиляцииисключение и нужно обрабатывать. Но я не понимаю, как обернуть проверенное исключение и выбросить его как непроверенное исключение. Если мы можем преобразовать проверенное исключение в непроверенное, то почему мы не можем сделать то же самое для каждогопроверенное исключение в Java. Я понимаю, что мне здесь не хватает логики, но, пожалуйста, помогите мне в этом. Также, кто-то может объяснить реальное преимущество этого?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

почему мы не можем сделать то же самое для каждого проверенного исключения в Java

Мы абсолютно можем сделать это каждый раз, когда это полезно.Как и в случае, который вы описываете.

Может ли кто-нибудь объяснить реальное преимущество этого?

Вы должны понять, насколько полезен SQLException на самом деледля вашей бизнес-логики.Ответ: не совсем.Вы почти никогда не принимаете решений в своем коде на основе SQLException.Если вы поймаете SQLException, вы не сможете использовать его информацию (например, сообщение, код), чтобы каким-то образом ветвиться в вашей бизнес-логике.Единственное исключение, о котором я знаю, это DuplicateKeyException, который можно использовать для определения того, что значение (например, имя для входа или адрес электронной почты) уже существует, и, таким образом, вы можете пропустить один выбор, чтобы повысить производительность.

Итак, ваш DAO не может использовать его, ваш сервис тоже, поэтому вам нужно распространить его на контроллер, перехватить, откатить транзакцию и вывести сообщение об ошибке пользователю.На самом деле, рамки делают это для вас.Они позволяют вам декларативно запускать транзакцию (@Transactional), автоматически выполнять откат, если с вашего контроллера вылетает исключение, и выводить сообщение об ошибке, используя некоторые ExceptionHandler.

Итак, вы видите, что вы действительно хотитеРаспространите эти исключения из вашей бизнес-логики (DAO, сервис, контроллер) в платформу.Если бы эти исключения были проверены, вам нужно было бы объявить throws во всех методах в цепочке.

Вот где обертка для непроверенных исключений становится хорошей практикой.Они уменьшают шаблон throws в коде.

0 голосов
/ 03 декабря 2018

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

Вот некоторые подробности, почему это полезная функция (подробности здесь ):

Исключения и способы их обработки всегда заканчиваются жаркими спорами между разработчиками Java.Неудивительно, что у Hibernate есть и примечательная история.До Hibernate 3.x все исключения, генерируемые Hibernate, были проверенными исключениями, поэтому каждый API Hibernate заставлял разработчика перехватывать и обрабатывать исключения.На эту стратегию повлиял JDBC, который также выбрасывает только проверенные исключения.Однако вскоре стало ясно, что это не имеет смысла, потому что все исключения, выдаваемые Hibernate, являются фатальными.Во многих случаях лучшее, что может сделать разработчик в этой ситуации, - это очистить, отобразить сообщение об ошибке и выйти из приложения.Поэтому, начиная с Hibernate 3.x, все исключения, генерируемые Hibernate, являются подтипами неконтролируемого исключения времени выполнения, которое обычно обрабатывается в одном месте в приложении.Это также делает любой шаблон Hibernate или API-интерфейс оболочки устаревшим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...