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) и снова создайте таблицу для проверки. Смотрите верхний ответ на этот вопрос для более точного объяснения.