即使我将属性设置为@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
表
答案 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)。命名一对:
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>
<span class="money_right">
<button class="money_bronze"><b>0</b></button>
<button class="money_silver"><b>0</b></button>
<button class="money_gold"><b>0</b></button>
<button class="gems"><b>0</b></button>
</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。
如果在Hibernate生成架构后更改了 实体 类frank(-x)
,则可以删除该架构并重新生成它。约束将适用。
您可以手动更改表,而不必删除架构
[Customer]