Ловля нарушений ограничений в JPA 2.0 - PullRequest
11 голосов
/ 23 мая 2010

Рассмотрим следующий класс сущностей, используемый, например, с EclipseLink 2.0.2, где атрибут link не является первичным ключом, но тем не менее уникальным.

@Entity
public class Profile {  
  @Id 
  private Long id;

  @Column(unique = true)
  private String link;

  // Some more attributes and getter and setter methods
}

Когда я вставляю записи сдублирующее значение для атрибута link, EclipseLink не выбрасывает EntityExistsException, но выдает DatabaseException, с сообщением, объясняющим, что уникальное ограничение было нарушено.

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

Я рассмотрел несколько вещей:

  • Проверка кода ошибки на DatabaseException - Боюсь, что эта ошибкакод, тем не менее, является собственным кодом ошибки для базы данных;
  • Проверка существования Profile с определенным значением для link заранее - это, очевидно, приведет к огромному количеству лишних запросов.

Ответы [ 2 ]

5 голосов
/ 24 мая 2010

Когда я вставляю записи с повторяющимся значением для атрибута ссылки, EclipseLink не выдает исключение EntityExistsException

Да, и провайдер JPA не должен выбрасывать EntityExistException, в этом случае вы не получите EntityExistException для чего-то другого, кроме первичного ключа .

(...), но выдает исключение DatabaseException с сообщением, объясняющим, что ограничение уникальности было нарушено.

Это очень НЕПРАВИЛЬНО от EclipseLink, провайдеру JPA следует выдать PersistenceException или подкласс, но, конечно, не конкретное исключение, например o.e.p.e.DatabaseException , Это ошибка, о которой следует сообщать, как я уже упоминал в предыдущем ответе .

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

Тот же ответ, что и выше, см. Мой предыдущий ответ .

2 голосов
/ 22 января 2011

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

protected Boolean isUniqueConstraintViolation(PersistenceException ex, Class entity) {

    if (((NonUniqueObjectException)ex.getCause()).getEntityName().equals(entity.getName())) {
        return true;
    }

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