0

JPA - @Column (unique=true) - Какова настоящая цель атрибута 'unique'?

14

Проблема с уникальным ограничением в JPA

У меня есть таблица subject с определением:

CREATE TABLE subject (id int PRIMARY KEY, name VARCHAR(255) UNIQUE)

и связанный класс-объект Mapped Object:

@Entity
@Table(name="subject")
public class SubjectDO {
    @Id
    @Column(name="id")
    int id;

    @Column(name="name", unique=true)
    String name;
    ...
    // Геттеры и сеттеры
}

Когда я пытаюсь сохранить объект с дублирующимся значением поля name, независимо от того, указано ли unique=true в аннотации, я получаю одинаковое поведение (одинаковое исключение). Очевидно, что реализация JPA не может проверить уникальность, не обращаясь к базе данных.

Какое реальное применение имеет атрибут unique=true в практике?

(Я предполагаю, что уникальное ограничение также определено на уровне базы данных.)

Версия проблемы на StackOverflow.com

Я сталкиваюсь с проблемой при использовании ограничения уникальности в JPA. У меня есть таблица subject, в которой поле name должно быть уникальным. Я создал соответствующий класс-объект SubjectDO с аннотацией @Column(name="name", unique=true). Однако, когда я пытаюсь сохранить объект с дублирующим значением для поля name, я получаю одно и то же исключение — как с unique=true, так и без него.

Я понимаю, что реализация JPA должна проверить уникальность только в тот момент, когда запись сохраняется в базу данных, и поэтому точно знает о конфликте только после выполнения операции. Но в чем же тогда заключается использование unique=true в JPA, если это не предотвращает попытку сохранения дубликатов?

Может кто-то объяснить, какое реальное практическое применение у этого свойства и как оно влияет на работу с данными в JPA, если уникальность уже определяется на уровне базы данных?

2 ответ(ов)

1

unique в аннотации @Column используется только в случае, если вы позволяете вашему JPA провайдеру создавать базу данных за вас — в таком случае будет создан уникальный ограничение для указанного столбца. Однако если у вас уже есть база данных, или вы вносите изменения после её создания, то unique не будет иметь никакого эффекта.

0

В аннотации @Column параметр unique=true используется только при генерации DDL (Data Definition Language), и не оказывает никакого влияния во время выполнения (runtime). Фактические проверки уникальности происходят на стороне базы данных.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь