Лучший способ обнаружить дубликаты при использовании Spring Hibernate Template - PullRequest
4 голосов
/ 07 мая 2010

У нас есть приложение, которое должно обнаруживать дубликаты в определенных полях при создании. Мы используем Hibernate в качестве нашего слоя постоянства и используем Spring HibernateTemplate. Мой вопрос заключается в том, лучше ли сделать предварительный поиск элемента перед его созданием или попытаться перехватить исключение DataIntegrityViolation, а затем проверить, не вызвано ли это дублирующейся записью.

Ответы [ 3 ]

9 голосов
/ 07 мая 2010

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

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

Есть способы получить эту информацию, основываясь на исключении, но она очень утомительна и специфична для базы данных (ищите ограничениеимя в БД (специфично для БД), получить поле, к которому он применяется, сопоставить поле со свойством объекта)

4 голосов
/ 08 мая 2010

Лучше проверить, есть ли данные в базе данных. Один из простых способов проверить, существуют ли данные в базе данных, состоит в том, чтобы ваши классы реализовали Hibernate LifeCyle api. Hibernate позволяет проверять поведение перед сохранением, но после того, как идентификатор связан с компонентом. Если определенная логика нарушена или не работает, то на операцию сохранения можно наложить вето.

public class Bean extends Serializable implements org.hibernate.classic.LifeCycle {
      public boolean onSave(Session s) {
          Query query = session.createQuery(from Bean b where b.field=:field");
          query.setParameters("field", this.field);
          @SuppressWarnings("unchecked")
          List<Bean> beans = query.list();
          if (beans != null && !beans.isEmpty()) {
              // This does not save the identity.
              return VETO;
          }
          return NO_VETO;
      }
}
1 голос
/ 07 мая 2010

Я определенно пойду с Божо ответом.Я думаю, что в этом и есть смысл.
В проекте, над которым я сейчас работаю, есть похожая проблема.Мы делимся информацией между несколькими серверами на основе фильтров, и могут быть сценарии, в которых полученные объекты уже добавлены в базу данных, поэтому может возникнуть исключение PK.

В нашем случае эти конфликты PK очень редки, и поэтому мы рассматриваем эту ситуацию как исключительную.Мы также используем spring и hibernate, и для того, чтобы разделить эти проблемы, и из-за определений транзакций Springs мы используем AOP, чтобы перехватить конкретное исключение DataIntegrity и перезапустить транзакцию, выполняя необходимые проверки целостности по требованию.на это, если вам нужна помощь с помощью ExceptionHandlerAdvice.

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