Рассмотрите следующий класс объекта, используемый с, например, EclipseLink 2.0.2 - где link
атрибут не является первичным ключом, но уникальным nontheless.
@Entity
public class Profile {
@Id
private Long id;
@Column(unique = true)
private String link;
// Some more attributes and getter and setter methods
}
Когда я вставляю записи с дублирующимся значением для link
атрибут, EclipseLink не бросает a EntityExistsException
, но броски a DatabaseException
, с сообщением, объясняющим, что ограничение на уникальность данных было нарушено.
Это не кажется очень полезным, поскольку не было бы простого, независимая база данных, способ поймать это исключение. Каков был бы рекомендуемый способ иметь дело с этим?
Несколько вещей, которые я рассмотрел:
DatabaseException
- Я боюсь, что этот код ошибки, тем не менее, является собственным кодом ошибки для базы данных;Profile
с определенным значением для link
заранее - это, очевидно, привело бы к огромному количеству лишних запросов.Когда я вставляю записи с повторяющимся значением для атрибута ссылки, EclipseLink не генерирует исключение EntityExistsException
Да, и поставщик JPA не должен генерировать исключение EntityExistException
] в этом случае вы не получите EntityExistException
ни для чего другого, кроме первичного ключа.
(...), но выдает исключение DatabaseException с сообщением, объясняющим, что уникальное ограничение было нарушено.
Это очень НЕПРАВИЛЬНО из EclipseLink, провайдер JPA должен генерировать исключение PersistenceException
или подкласс, но определенно не конкретное исключение, такое как o.e.p.e.DatabaseException
. Это ошибка, и о ней следует сообщать, как я уже упоминал в предыдущем ответе .
Это не кажется очень полезным, поскольку не существует простого, независимого от базы данных способа перехвата этого исключения. Что было бы рекомендованным способом справиться с этим?
Тот же ответ, что и выше, см. Мой предыдущий ответ .