@Column(unique=true), похоже, не работает

Даже если я устанавливаю атрибут @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

Ответы

Ответ 1

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

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

create Customer (id int primary key, name varchar(255) unique);

Ответ 2

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

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

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

ALTER TABLE Customer ADD CONSTRAINT customer_name_unq UNIQUE (name);

См. также

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

Ответ 3

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

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

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

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