JPA - @Column (unique=true) - Какова настоящая цель атрибута 'unique'?
Проблема с уникальным ограничением в 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 ответ(ов)
unique в аннотации @Column используется только в случае, если вы позволяете вашему JPA провайдеру создавать базу данных за вас — в таком случае будет создан уникальный ограничение для указанного столбца. Однако если у вас уже есть база данных, или вы вносите изменения после её создания, то unique не будет иметь никакого эффекта.
В аннотации @Column параметр unique=true используется только при генерации DDL (Data Definition Language), и не оказывает никакого влияния во время выполнения (runtime). Фактические проверки уникальности происходят на стороне базы данных.
Как исправить ошибку Hibernate "объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом"
JPA JoinColumn против mappedBy: в чем разница?
В чем разница между JPA и Hibernate? [закрыт]
Создание репозитория Spring без сущности
Выбор первого результата с использованием JPA