@Column(unique=true) does not seem to work
The unique=true
element of the Column
annotation and / or the UniqueConstraint
annotation that can be used at the table level are used to specify that a unique constraint is to be included in the generated DDL.
In other words, they don't do anything during the runtime, the verification is left to the database (which makes sense as unicity can't be tested at the Java level reliably1) and if for whatever reason you don't have the corresponding constraint(s) defined at the database level, nothing will happen.
Add the constraint manually:
ALTER TABLE Customer ADD CONSTRAINT customer_name_unq UNIQUE (name);
See also
- JPA 1.0 specification
- 9.1.4 UniqueConstraint Annotation
- 9.1.5 Column Annotation
- MySQL Documentation
- 12.1.7. ALTER TABLE Syntax
1 Unless you acquire a table lock (ouch!), you can't check for unicity with a SQL query in a concurrent environment.
For future users stumbling on this issue. There are lots of great suggestions here; read through them as well as your error messages; they will be enough to resolve your problem.
A few things I picked up in my quest to get @Column(unique=true)
working. In my case I had several issues (I was using Spring Boot, FYI). To name a couple:
- My
application.properties
was usingspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
despite using MySQL 8. I fixed this withspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
. Check your version (I did this through the command line:mysql> STATUS
). - I had a
User
class annotated as an@entity
which meant that JPA was trying to create auser
table which is one of MySQL's (as well as postgres) reserved keywords. I fixed this with@Table(name = "users")
.
I did not create table using JPA
Then you should add the unique constraint to your table in your CREATE
statement, for example, if you are using MySQL:
create Customer (id int primary key, name varchar(255) unique);