Лучшие практики для обработки уникальных нарушений ограничений на уровне пользовательского интерфейса - PullRequest
2 голосов
/ 13 марта 2011

Во время работы в моем приложении я столкнулся с ситуацией, в которой есть вероятность отменить нарушение ограничений. У меня есть следующие варианты

  1. Перехватите исключение и верните его в пользовательский интерфейс
  2. В пользовательском интерфейсе проверьте исключение и покажите сообщение об ошибке approrpriate
  3. Это другая идея: заранее проверить наличие данного уникального значения перед началом всей операции.

Мой вопрос - что может быть лучшим решением в такой ситуации? В настоящее время мы используем комбинацию Struts2 + Spring 3.x + Hibernate 3.x

.

Заранее спасибо

редактировать

В случае, если мы решим разрешить базе данных дать окончательный вердикт, мы обработаем исключение и передадим это исключение в пользовательский интерфейс и покажем сообщение согласно исключению. То, что вы предлагаете, должно распространять то же исключение (org.hibernate.exception.ConstraintViolationException) для Уровень пользовательского интерфейса или мы должны создать для этого отдельный класс исключений, поскольку распространение исключения Hibernate в пользовательском интерфейсе означает загрязнение классов UI с помощью импорта, специфичного для Hibernate, и других вещей

Ответы [ 2 ]

2 голосов
/ 13 марта 2011

Лучший способ ответить на этот вопрос - разделить его на две идеи.

1) Где в конечном итоге применяется уникальное ограничение? В этом случае (из вашего вопроса) ответом является база данных.

2) Как мы можем улучшить взаимодействие с пользователем, проверяя ограничения в других местах?

Поскольку база данных в конечном итоге примет решение в рамках транзакции , никакой полезной проверки вы не сможете сделать заранее. Даже если вы проверяете перед вставкой, возможно (хотя обычно это маловероятно), чтобы другой пользователь вставил это значение во времени между проверкой и фактической вставкой.

Так что пусть база данных решит и отправит сообщение об ошибке обратно в интерфейс.

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

Итак, для некоторых ограничений, да, пусть поможет пользовательский интерфейс. Но для уникальных ограничений пользовательский интерфейс действительно не может помочь, потому что база данных является окончательным авторитетом, и нет никакой полезной проверки, которую вы можете гарантировать, что вы гарантированно останетесь верным, когда вы сделаете вставку.

0 голосов
/ 13 марта 2011

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

...