如何使用JPA创建UNIQUE列?

时间:2018-09-22 10:35:28

标签: java mysql sql hibernate jpa

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

8 个答案:

答案 0 :(得分:1)

显然,这段代码没有错。 {{ $book->id }} 中的unique=true@Column和其他特定约束的快捷方式。除了多个唯一约束,您只能使用其中之一。

但是,如果您对为什么生成的@UniqueConstraint(columnNames = {"user_id"}不包含这些唯一约束感到困惑,请查看日志,您可以在CREATE TABLE之后找到alter table命令。

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

CREATE TABLE

希望获得帮助。

答案 1 :(得分:1)

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

但是在创建数据库后,或者您在创建数据库后对其进行了更改, 然后唯一不起作用

答案 2 :(得分:0)

尝试这样:

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

        public class Users {

答案 3 :(得分:0)

在jpa中,该ID已经是唯一的,因此要使用户名和电子邮件唯一,请添加该语句

componentDidMount() {
        fetch("my api", {
          method: "GET",
          headers: ({
          Accept: "application/vnd.api+json",
          "Content-Type": "application/json",
          "X-Api-Version": 20161108,
          Authorization: "Token my token",
         }),
          body: JSON.stringify()
        }).then(response => {
          if (response.status === 200) {
            console.log(response)
            return response.json()
          } else {
            console.log("oh no!", response.status === 404)
          }
        })
      }

到相应的unique=true 注释。

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

答案 4 :(得分:0)

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

@Column(name =“ userName”,长度= 50,唯一= true)

答案 5 :(得分:0)

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

@Column(name =“ username”,长度= 200,唯一= true)

答案 6 :(得分:0)

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

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

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

这将在必要时更新架构。

答案 7 :(得分:0)

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

@Column(unique = true) 不起作用

@Column(unique = true, nullable = false) 会起作用