即使我将属性设置为@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
表
9条答案
按热度按时间ltqd579y1#
可以在表级使用的
Column
注解和/或UniqueConstraint
注解的unique=true
元素用于指定唯一约束将被包括在生成的DDL中。换句话说,它们在运行时不做任何事情,验证留给数据库(这是有意义的,因为在Java级别无法可靠地测试unicity 1),如果出于任何原因,您没有在数据库级别定义相应的约束,则什么也不会发生。
手动添加约束:
另请参见
1除非你获得了一个表锁(哎哟!),否则你不能在并发环境中检查SQL查询的唯一性。
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")
解决了这个问题。rekjcdws3#
我没有使用JPA创建表
然后应该在
CREATE
语句中向表添加唯一约束,例如,如果使用MySQL:ncecgwcz4#
尝试在类级别使用
@Column(unique=true)对我不起作用,但当我在类级别使用@UniqueConstraint时,数据库(MySql)中的列被适当地设置为唯一的。
我希望这有助于其他人谁可能面临同样的问题在未来
nfg76nw05#
对于InnoDB表,有索引列的限制。这意味着,你必须设置te字段的最大长度:
11dmarpk6#
我也遇到过类似的问题,但都解决了。
这对我很有效。
bq9c1y667#
确保删除数据库中由hibernate创建的表,然后重新运行hibernate应用程序。
k3fezbri8#
MySQL Hibernate对象关系Map-生成架构后更改包含。
1.如果在Hibernate生成schema之后,你修改了你的***entity***class
[Customer]
,你可以删除schema并重新生成它。约束将适用。1.您可以手动更改表,而不是删除模式
ALTER TABLE Customer ADD CONSTRAINT customer_name_unq UNIQUE (name);
kzipqqlq9#
当您在运行的应用程序中间添加验证时,也会发生这种情况,其中所有数据库和表都已创建。
由于@Column是持久化级别注解,因此它仅在必需字段中找到唯一约束时才起作用。
因此,只需添加所有必需的注解,删除所有表,然后重新运行应用程序。这样,应用程序将再次创建所有标有@Entity注解的表,并为其添加'unique'约束。
值得注意的是,所有@Column注解都将具有相同的行为,因此建议在head之前添加所有必需的持久化级别验证,以便您不需要一次又一次地删除表。