mysql @Column(unique=true)似乎不起作用

lfapxunr  于 2023-03-28  发布在  Mysql
关注(0)|答案(9)|浏览(160)

即使我将属性设置为@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设置create

ltqd579y

ltqd579y1#

可以在表级使用的Column注解和/或UniqueConstraint注解的unique=true元素用于指定唯一约束将被包括在生成的DDL中。
换句话说,它们在运行时不做任何事情,验证留给数据库(这是有意义的,因为在Java级别无法可靠地测试unicity 1),如果出于任何原因,您没有在数据库级别定义相应的约束,则什么也不会发生。
手动添加约束:

ALTER TABLE Customer ADD CONSTRAINT customer_name_unq UNIQUE (name);

另请参见

1除非你获得了一个表锁(哎哟!),否则你不能在并发环境中检查SQL查询的唯一性。

lxkprmvk

lxkprmvk2#

对于未来的用户在这个问题上绊倒。这里有很多很好的建议;通读它们以及您的错误消息;他们将足以解决你的问题。
我在寻求让@Column(unique=true)工作的过程中发现了一些事情。在我的情况下,我遇到了几个问题(我使用Sping Boot ,FYI)。举几个例子:

  • 我的application.properties使用的是spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect,尽管使用的是MySQL 8。我用spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect解决了这个问题。检查你的版本(我通过命令行做到了这一点:mysql> STATUS)。
  • 我有一个User类注解为@entity,这意味着JPA试图创建一个user表,这是MySQL(以及postgres)的保留关键字之一。我用@Table(name = "users")解决了这个问题。
rekjcdws

rekjcdws3#

我没有使用JPA创建表
然后应该在CREATE语句中向表添加唯一约束,例如,如果使用MySQL:

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

ncecgwcz4#

尝试在类级别使用

@Table(uniqueConstraints={@UniqueConstraint(columnNames={"name"})})
public class Customer {
...
    private String name;
}

@Column(unique=true)对我不起作用,但当我在类级别使用@UniqueConstraint时,数据库(MySql)中的列被适当地设置为唯一的。
我希望这有助于其他人谁可能面临同样的问题在未来

nfg76nw0

nfg76nw05#

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

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

11dmarpk6#

我也遇到过类似的问题,但都解决了。

  • 首先,从数据库中删除表
drop table Customer;
  • 停止Sping Boot 应用程序并再次启动它。

这对我很有效。

bq9c1y66

bq9c1y667#

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

k3fezbri

k3fezbri8#

MySQL Hibernate对象关系Map-生成架构后更改包含。
1.如果在Hibernate生成schema之后,你修改了你的***entity***class [Customer],你可以删除schema并重新生成它。约束将适用。
1.您可以手动更改表,而不是删除模式
ALTER TABLE Customer ADD CONSTRAINT customer_name_unq UNIQUE (name);

kzipqqlq

kzipqqlq9#

当您在运行的应用程序中间添加验证时,也会发生这种情况,其中所有数据库和表都已创建。
由于@Column是持久化级别注解,因此它仅在必需字段中找到唯一约束时才起作用。
因此,只需添加所有必需的注解,删除所有表,然后重新运行应用程序。这样,应用程序将再次创建所有标有@Entity注解的表,并为其添加'unique'约束。
值得注意的是,所有@Column注解都将具有相同的行为,因此建议在head之前添加所有必需的持久化级别验证,以便您不需要一次又一次地删除表。

相关问题