Ответ 1
Я не создал таблицу с помощью JPA
Затем вы должны добавить уникальное ограничение в таблицу в свой оператор CREATE
, например, если вы используете MySQL:
create Customer (id int primary key, name varchar(255) unique);
Даже если я устанавливаю атрибут @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
Я не создал таблицу с помощью JPA
Затем вы должны добавить уникальное ограничение в таблицу в свой оператор CREATE
, например, если вы используете MySQL:
create Customer (id int primary key, name varchar(255) unique);
Элемент unique=true
аннотации Column
и/или аннотации UniqueConstraint
, которые могут использоваться на уровне таблицы, используются для указания того, что уникальное ограничение должно быть включено в созданный DDL.
Другими словами, они ничего не делают во время выполнения, проверка остается в базе данных (что имеет смысл, поскольку однозначность не может быть проверена на уровне Java достоверно 1) и если по какой-либо причине у вас нет соответствующих ограничений (ограничений), определенных на уровне базы данных, ничего не произойдет.
Добавьте ограничение вручную:
ALTER TABLE Customer ADD CONSTRAINT customer_name_unq UNIQUE (name);
1 Если вы не приобрели блокировку таблицы (ouch!), вы не можете проверить однозначность с SQL-запросом в параллельной среде.
Попробуйте указать уникальное ограничение на уровне класса, используя
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"name"})})
public class Customer {
...
private String name;
}
@Column (unique = true) не работает для меня, но когда я использовал @UniqueConstraint на уровне класса, столбец в базе данных (MySql) был соответствующим образом задан как уникальный.
Я надеюсь, что это поможет кому-то другому, кто может столкнуться с этой проблемой в будущем