@Column(unique=true) does not seem to work

Viewed 28982

Even though I set the attribute to be @Column(unique=true), I still insert a duplicate entry.

@Entity
public class Customer {

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

    @Column(unique=true )
    private String name;

    ...
}

I set the name using regular EL in JSF. I did not create table using JPA

8 Answers

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 using spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect despite using MySQL 8. I fixed this with spring.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 a user table which is one of MySQL's (as well as postgres) reserved keywords. I fixed this with @Table(name = "users").

For InnoDB tables , there are limit for indexed columns. That means, you have to set max length for te field:

@Column(unique = true, length = 32)
private String name;

I was also facing the similar issue but got it resolved.

  • First, drop the table from Database

      drop table Customer;
    
  • Stop your spring boot application and launch it again.

    This worked for me.

Make sure to delete the tables created by hibernate in your database. And then re-run your hibernate application again.

MySQL Hibernate Object Relational Mapping - Alter Contains after schema was generated.

  1. In case you change your entity class [Customer] after the Hibernate generated the schemas, you can drop the schema and re-generate it. The constrains will apply.

  2. Instead of dropping schemas you can manually alter the table

ALTER TABLE Customer ADD CONSTRAINT customer_name_unq UNIQUE (name);

Related