Mysql @列(unique=true)似乎不起作用

Mysql @列(unique=true)似乎不起作用,mysql,jpa,jakarta-ee,orm,Mysql,Jpa,Jakarta Ee,Orm,即使我将属性设置为@Column(unique=true),我仍然会插入一个重复的条目 @Entity public class Customer { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(unique=true ) private String name; ... } 我使用JSF中的常规EL设置name。我没有使用JPA

即使我将属性设置为
@Column(unique=true)
,我仍然会插入一个重复的条目

@Entity
public class Customer {

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

    @Column(unique=true )
    private String name;

    ...
}
我使用
JSF
中的常规
EL
设置
name
。我没有使用
JPA

我并没有使用JPA创建表

然后,您应该在
CREATE
语句中将唯一约束添加到表中,例如,如果您使用的是MySQL:

create Customer (id int primary key, name varchar(255) unique);

可在表级别使用的
注释的
unique=true
元素和/或
UniqueConstraint
注释用于指定生成的DDL中包含唯一约束

换句话说,它们在运行时不做任何事情,验证由数据库进行(这是有道理的,因为unicity无法在Java级别可靠地进行测试1),如果出于任何原因,您没有在数据库级别定义相应的约束,那么什么也不会发生

手动添加约束:

ALTER TABLE Customer ADD CONSTRAINT customer_name_unq UNIQUE (name);
另见
  • JPA1.0规范
    • 9.1.4唯一约束注释
    • 9.1.5柱注释
  • MySQL文档

1除非获得表锁(哎哟!),否则无法在并发环境中使用SQL查询检查唯一性

尝试使用

@Table(uniqueConstraints={@UniqueConstraint(columnNames={"name"})})
public class Customer {
...
    private String name;
}
@列(unique=true)对我不起作用,但当我在类级别使用@UniqueConstraint时,数据库(MySql)中的列被适当地设置为unique


我希望这对将来可能面临同样问题的其他人有所帮助

对于InnoDB表,索引列是有限制的。这意味着您必须为te字段设置最大长度:

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

确保删除数据库中由hibernate创建的表。然后再次重新运行hibernate应用程序

供未来用户在这个问题上绊倒。这里有很多很好的建议;通读它们以及您的错误消息;它们足以解决你的问题

我在寻找
@Column(unique=true)
的过程中学到了一些东西。在我的例子中,我有几个问题(仅供参考,我使用的是Spring Boot)。举一对夫妇的名字:


  • 我的
    application.properties
    使用的是
    spring.jpa.properties.hibernate.dialent=org.hibernate.dialent.mysql5dialent
    ,尽管使用的是MySQL 8。我用
    spring.jpa.properties.hibernate.dialogue=org.hibernate.dialogue.mysql8dialogue
    修复了这个问题。检查您的版本(我通过命令行执行此操作:
    mysql>STATUS
  • 我有一个
    User
    类被注释为
    @实体
    ,这意味着JPA试图创建一个
    User
    表,它是MySQL(以及postgres)的一个表。我用
    @Table(name=“users”)
    修复了这个问题
我也面临类似的问题,但问题得到了解决

  • 首先,从数据库中删除该表

      drop table Customer;
    
  • 停止spring引导应用程序并再次启动它

    这对我有用


MySQL Hibernate对象关系映射-生成架构后的Alter Contains

  • 如果您在Hibernate生成模式后更改了实体
    [Customer]
    ,您可以删除模式并重新生成它。约束将适用

  • 您可以手动更改表,而不是删除模式

  • ALTER TABLE Customer ADD CONSTRAINT Customer\u name\u unq UNIQUE(name)


    如果您的JPA供应商(ie hibernate)在这个场景中负责更新模式,那就太好了,但不幸的是,它没有。我想知道是否有一个错误/特性请求用于iTibernate注释:@Column(unique=true)字符串userName;下面是我的hibernate denerated DDL:创建表
    user
    id
    bigint(20)非空自动增量,
    name
    varchar(255)默认为空,
    password
    varchar(255)非空,
    userName
    varchar(255)非空,主键(
    id
    ),唯一键
    userName
    userName
    )ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin仍然可以插入重复项,您可以这样说:“除非您获得了表锁(哎哟!),否则无法在并发环境中使用SQL查询检查唯一性。”但即使是实际检查(如果已经有一行具有此属性值)没有锁是有帮助的。比如说,在99%的情况下它是正确的。在任何情况下,a(快速和肮脏)非常需要Java bean类的唯一性检查。我也这么认为@Kukeltje,但它对我不起作用。我使用springboot和hibernate作为JPA提供程序和MySql dbms。但是,正如我指出的,“@Table”中的类级别上的“@UniqueControint”对我来说非常有效。“不起作用”有点模糊……它是否会在字段上生成唯一的约束?或者它们是否被强制执行?或者……您使用的是什么hibernate版本?以及什么数据库?请尽可能具体,谢谢您的评论@Kukeltje。我已经对这两个案例进行了测试,发现
    @Column(unique=true)
    实际上是有效的(强制执行唯一约束),但仅当该表在数据库中不存在时。之后使用
    @Column(unique=true)
    (即以前生成该表时)不使用唯一约束更新表。但是无论该表是否已存在,
    @UniqueConstraint
    始终适用于我。Hibernate版本为5.0.12,我的数据库为MySQL@Kukeltje,它也没有为我创建唯一索引。这是我的注释
    @Column(columnDefinition=“varchar(100)not null”,unique=true)
    。但是,如果我删除
    列定义
    部分,它工作得非常好。请更新以上内容