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)
。但是,如果我删除列定义
部分,它工作得非常好。请更新以上内容