@Column (unique = true), похоже, не работает - PullRequest
15 голосов
/ 16 августа 2010

Несмотря на то, что я установил атрибут на @Column(unique=true), я все равно вставляю повторяющуюся запись.

@Entity
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(unique=true )
    private String name;

    ...
}

Я установил name, используя обычные EL в JSF.Я не create таблица с использованием JPA

Ответы [ 6 ]

18 голосов
/ 17 августа 2010

Элемент unique=true аннотации Column и / или аннотации UniqueConstraint, которые можно использовать на уровне таблицы, используются для указания того, что уникальное ограничение должно быть включено в сгенерированный DDL .

Другими словами, они ничего не делают во время выполнения, проверка оставлена ​​для базы данных (что имеет смысл, поскольку уникальность не может быть надежно проверена на уровне Java 1 ) и если по какой-либо причине у вас нет соответствующих ограничений, определенных на уровне базы данных, ничего не произойдет.

Добавьте ограничение вручную:

ALTER TABLE Customer ADD CONSTRAINT customer_name_unq UNIQUE (name);

См. также

1 Если вы не получили блокировку таблицы (ой!), Вы не можете проверить уникальность с помощьюSQL-запрос в параллельной среде.

7 голосов
/ 17 августа 2010

Я не создавал таблицу с использованием JPA

Затем вы должны добавить уникальное ограничение к вашей таблице в вашем выражении CREATE, например, если вы используете MySQL:

create Customer (id int primary key, name varchar(255) unique);
4 голосов
/ 02 марта 2019

Для будущих пользователей, спотыкающихся в этом вопросе.Здесь много отличных предложений;прочитайте их, а также ваши сообщения об ошибках;их будет достаточно, чтобы решить вашу проблему.

Несколько вещей, которые я подобрал в своем стремлении заставить @Column(unique=true) работать.В моем случае у меня было несколько проблем (я использовал Spring Boot, FYI).Чтобы назвать пару:

  • Мой application.properties использовал spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect несмотря на использование MySQL 8. Я исправил это с помощью spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect.Проверьте вашу версию (я сделал это через командную строку: mysql> STATUS).
  • У меня был класс User, аннотированный как @entity, что означало, что JPA пытается создать таблицу user, котораяявляется одним из MySQL (а также postgres) зарезервированных ключевых слов .Я исправил это с помощью @Table(name = "users").
1 голос
/ 21 апреля 2018

Для таблиц InnoDB существует ограничение для индексированных столбцов. Это означает, что вы должны установить максимальную длину для поля te:

@Column(unique = true, length = 32)
private String name;
1 голос
/ 16 июля 2017

Попробуйте указать уникальное ограничение на уровне класса, используя

@Table(uniqueConstraints={@UniqueConstraint(columnNames={"name"})})
public class Customer {
...
    private String name;
}

@ Column (unique = true) у меня не работает, но когда я использовал @UniqueConstraint на уровне класса, столбец в базе данных (MySql) был соответственно установлен как уникальный.

Я надеюсь, что это поможет кому-то еще, кто может столкнуться с этой же проблемой в будущем

0 голосов
/ 26 сентября 2018

Обязательно удалите таблицы, созданные hibernate, в вашей базе данных.А затем снова запустите приложение гибернации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...