【问题标题】:How to create UNIQUE column with JPA?如何使用 JPA 创建 UNIQUE 列?
【发布时间】:2019-02-26 13:51:55
【问题描述】:

我的 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 |

spring 启动后的休眠日志

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

【问题讨论】:

  • 在运行应用程序之前表是否存在? unique 属性仅在表不存在且由应用程序创建时才有效。
  • @S.K.不,它是新数据库 ...JPA 将创建一切
  • @OsamaAl-Banna 您在 db 中创建的表是否包含唯一索引约束?
  • @OsamaAl-Banna 澄清一下,你是如何检查唯一约束是否添加到表中的?
  • 我的数据库是新鲜的,没有任何表存在于表元数据中。

标签: java mysql sql hibernate jpa


【解决方案1】:

试试这样:

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

        public class Users {

【讨论】:

  • 我已经尝试过这种方法,但不幸的是它不起作用。
【解决方案2】:

显然这段代码没有任何问题。 @Column 中的 unique=true@UniqueConstraint(columnNames = {"user_id"} 和其他特定约束的快捷方式。除了多个唯一约束外,您只能使用其中一个。

但是如果你对为什么生成的CREATE TABLE 不包含这些唯一约束感到困惑,查看日志,你可以在CREATE TABLE 之后找到alter table 命令。

在这种情况下,命令可能是,

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

希望对您有所帮助。

【讨论】:

  • 谢谢本杰明,我不明白你的意思,但我在创建表时添加了 Hibernate 日志,当时 Spring Boot 开始出现问题。
  • @OsamaAl-Banna 尝试删除 uniqueConstraints of @Table
  • 还是一样,但我注意到一些独特的功能现在在 JAVA 对象级别工作,但在数据库级别有独特的功能,但是当我尝试插入其余 API 时它赢了不允许我。
  • @OsamaAl-Banna 是唯一键是否存在于 db 中?插入数据时会发生什么?有什么例外吗?
  • 数据库中不存在唯一键...但是应用程序不允许我传递重复值,但是...如果直接在数据库中插入值是的,我可以。但是从应用程序我不能。
【解决方案3】:

如果你在@Column 中设置唯一 这意味着让您的 JPA 提供商为您创建数据库 - 它将在指定列上创建唯一约束。

但是在创建数据库之后,或者你一旦创建就改变它, 那么唯一性没有任何影响

【讨论】:

  • 此答案中的陈述具有误导性或不正确。
【解决方案4】:

在 jpa 中,id 已经是唯一的,因此要使用户名和电子邮件唯一,请添加声明

unique=true

到对应的@Column注解。

PS : 请记住,插入新项目时唯一不能为空,您应该在运行应用程序之前删除表并删除表注释中的uniqueConstraints

【讨论】:

    【解决方案5】:

    我在这里遇到了同样的问题,将长度设置为您的唯一列。它在这里工作。做

    @Column(name = "userName", length = 50, unique = true)

    【讨论】:

      【解决方案6】:

      将列设置为具有固定长度使其工作,因为唯一约束的 mysql 大小限制为 1000 字节

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

      【讨论】:

        【解决方案7】:

        使用@javax.persistence.Column(unique = true)。 不要忘记重新启动您的应用程序。

        && 如果列中仍有重复值,则无法更改列。 删除您的表,并使用您生成的 ddl 重新创建它。 (如果你不使用springboot)

        && 如果您使用的是 springboot,请转到您的 application.properties 并将 spring.jpa.hibernate.ddl-auto 设置为 update

        如有必要,这会更新架构。

        【讨论】:

          【解决方案8】:

          该列必须不可为空才能唯一!

          @Column(unique = true) 将不起作用

          @Column(unique = true, nullable = false) 可以工作

          【讨论】:

            猜你喜欢
            • 2012-03-20
            • 2021-12-13
            • 1970-01-01
            • 2021-08-16
            • 2016-10-27
            • 2017-10-13
            • 2011-10-10
            • 2012-12-16
            相关资源
            最近更新 更多