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

时间:2010-08-16 18:18:01

标签: mysql jpa java-ee orm

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

@Entity
public class Customer {

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

    @Column(unique=true )
    private String name;

    ...
}

我在name中使用常规EL设置JSF。我没有使用create

JPA

8 个答案:

答案 0 :(得分:18)

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

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

手动添加约束:

ALTER TABLE Customer ADD CONSTRAINT customer_name_unq UNIQUE (name);

另见

1 除非您获得表锁(哎!),否则无法在并发环境中检查SQL查询的单一性。

答案 1 :(得分:7)

  

我没有使用JPA创建表

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

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

答案 2 :(得分:2)

供将来的用户在此问题上迷tum。这里有很多很棒的建议;阅读它们以及您的错误消息;它们足以解决您的问题。

为了让@Column(unique=true)工作,我进行了一些尝试。就我而言,我遇到了几个问题(我使用的是Spring Boot,FYI)。命名一对:

  • 尽管使用MySQL 8,我的application.properties仍在使用spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect,而我使用spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect进行了修复。检查您的版本(我通过命令行进行此操作:mysql> STATUS)。
  • 我有一个User类,其注释为@entity,这意味着JPA试图创建一个user表,该表是MySQL(以及postgres)之一{{3} }。我用@Table(name = "users")解决了这个问题。

答案 3 :(得分:1)

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

<nav class="navbar bg-blue fixed-top">
  <span style="color: white;"><b>GUEST</b></span>&nbsp;
     <span class="money_right">
        <button class="money_bronze"><b>0</b></button>&nbsp;
        <button class="money_silver"><b>0</b></button>&nbsp;
        <button class="money_gold"><b>0</b></button>&nbsp;
        <button class="gems"><b>0</b></button>&nbsp;
    </span>
</nav>

答案 4 :(得分:1)

我也面临着类似的问题,但得到了解决。

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

      drop table Customer;
    
  • 停止您的spring boot应用程序,然后再次启动它。

    这对我有用。

答案 5 :(得分:0)

尝试使用

在类级别指定唯一约束
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"name"})})
public class Customer {
...
    private String name;
}

@Column(unique = true)对我不起作用,但是当我在类级别使用@UniqueConstraint时,数据库中的列(MySql)被适当地设置为唯一。

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

MySQL Hibernate对象关系映射-生成架构后包含Alter。

  1. 如果在Hibernate生成架构后更改了 实体 frank(-x),则可以删除该架构并重新生成它。约束将适用。

  2. 您可以手动更改表,而不必删除架构

[Customer]