JPA - @Column (unique=true) - Какой смысл иметь атрибут "уникальный"?

Предположим, у меня есть "предметная" таблица

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;
    ...
    // Getter-Setter methods
}

Когда я пытаюсь сохранить объект с повторяющимся "именем" с определением "уникальное = истинное" и без него, я получаю похожее поведение (то же исключение). И очевидно, что реализация JPA действительно ничего не может сделать, если не обратиться к БД для проверка.

Каков реальный вариант использования для этого?

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

3 ответа

Решение

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

unique=true в @Column аннотация будет использоваться только в DDL generation, это не имеет никакого влияния во время выполнения. Фактическая проверка уникальности происходит в database,

Существует ситуация, когда поле varchar слишком длинное, скажем, длина 255 с кодировкой utf8mb4, тогда уникальное ограничение не будет работать, даже если JPA повторно создаст таблицу с уникальным значением true. Попробуйте установить поле с помощью @Column(length=128, unique=ture) и снова создайте таблицу для проверки. Смотрите верхний ответ на этот вопрос для более точного объяснения.

Другие вопросы по тегам