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? [закрыт]
Возможные значения конфигурации hbm2ddl.auto в Hibernate и их назначение
Создание репозитория Spring без сущности