Как создать уникальный столбец с JPA? - PullRequest
0 голосов
/ 22 сентября 2018

Мой POJO использует JPA, и когда я применяю уникальное значение в столбце, у меня не работает, я пытался использовать UniqueConstraint, а также не работает для меня.

ниже мой код

@Entity
@Table(name = "users", uniqueConstraints={@UniqueConstraint(columnNames = {"user_id"}),@UniqueConstraint(columnNames = {"username"}),@UniqueConstraint(columnNames = {"email"})})

    public class Users {

     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Column(name="user_id",unique=true,nullable = false)
     private int UserId;

     @Column(name = "username" ,unique=true,nullable = false)
     private String Username;

     @Column(name = "email",unique=true ,nullable = false)
     private String email;

     @Column(name = "firstname",nullable = false)
     private String firstname;

     @Column(name = "lastname", nullable = false)
     private String lastname;

     @Column(name = "password", nullable = false)
     private String password;

     @Column(name = "active")
     private int active;

     @ManyToMany(cascade=CascadeType.ALL)
     @JoinTable(name="user_role", joinColumns=@JoinColumn(name="user_id"), inverseJoinColumns=@JoinColumn(name="role_id"))
     private Set<Role> roles;

ниже - сгенерированная таблица в базе данных (MySQL)

| users | CREATE TABLE users (
  user_id int(11) NOT NULL,
  username varchar(255) NOT NULL,
  active int(11) DEFAULT NULL,
  email varchar(255) NOT NULL,
  firstname varchar(255) NOT NULL,
  lastname varchar(255) NOT NULL,
  password varchar(255) NOT NULL,
  PRIMARY KEY (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |

Журнал гибернации после запуска весны

Hibernate: create table users (user_id integer not null, username varchar(255) not null, active integer, email varchar(255) not null, firstname varchar(255) not null, lastname varchar(255) not null, password varchar(255) not null, primary key (user_id)) engine=InnoDB Hibernate: alter table users drop index UKfnranlqhubvw04boopn028e6 Hibernate: alter table users add constraint UKfnranlqhubvw04boopn028e6 unique (username, email) Hibernate: alter table users drop index UK_r43af9ap4edm43mmtq01oddj6 Hibernate: alter table users add constraint UK_r43af9ap4edm43mmtq01oddj6 unique (username) Hibernate: alter table users drop index UK_6dotkott2kjsp8vw4d0m25fb7

Ответы [ 6 ]

0 голосов
/ 31 мая 2019

Установите для столбца фиксированную длину, чтобы он работал, поскольку размер mysql для уникальных ограничений ограничен 1000 байтами

@ Column (name = "username", length = 200, unique = true)

0 голосов
/ 12 декабря 2018

У меня была такая же проблема, задайте длину для ваших уникальных столбцов.Do

@ Column (name = "userName", длина = 50, unique = true)

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

если в @Column задано уникальное значение, что означает , пусть ваш провайдер JPA создаст для вас базу данных - он создаст уникальное ограничение для указанного столбца.

Но после создания базы данныхили вы изменили его после создания, , тогда уникальный не имеет никакого эффекта

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

Видимо, в этом коде нет ничего плохого.unique=true в @Column является ярлыком для @UniqueConstraint(columnNames = {"user_id"} и других конкретных ограничений.Вы можете использовать только одно из них, за исключением нескольких уникальных ограничений.

Но если вы не уверены, почему сгенерированный CREATE TABLE не содержит этих уникальных ограничений, проверьте журнал, вы можете найти команды alter table простопосле CREATE TABLE.

В этом случае команды могут быть,

alter table users add constraint UK_some_id unique (username)
alter table users add constraint UK_some_id unique (email)

Надеюсь, что это поможет.

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

в jpa идентификатор уже уникален, поэтому чтобы сделать имя пользователя и адрес электронной почты уникальными, добавьте оператор

unique=true

в соответствующую аннотацию @Column.

PS: запомните, что уникальное нельзяnull при вставке нового элемента вы должны удалить таблицу перед запуском приложения и удалить uniqueConstraints в аннотации таблицы

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

Попробуй так:

 @Entity
    @Table(name="users",uniqueConstraints=@UniqueConstraint(columnNames={"user_id","username","email"}))

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