为什么在Hibernate实体中的"unique = true"不起作用?
为什么在Hibernate实体中的"unique = true"不起作用?
我已经创建了一个具有表名和列名的实体。
我还为一个列名添加了唯一键约束。但是当我运行时,它显示以下错误;
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "alter table ingredient add constraint UK_co7ro6kyijhfik027h0y4d3n3 unique (ingredient_name). java.sql.SQLSyntaxErrorException: Specified key was too long; max key length is 1000 bytes
- 在运行spring boot应用程序后,我尝试在MySQL workbench中手动添加唯一约束-不起作用
- 我添加了以下代码-不起作用
@Table(name = "ingredient", uniqueConstraints=@UniqueConstraint(name="uk_ingredient_name",columnNames="ingredient_name")) @Column(name = "ingredient_name" ,unique = true) private String ingredientName;
- 尝试在Mysql workbench中手动创建一个表,然后尝试稍后使用唯一键更改列名-这个方法有效。但我希望Hibernate为我完成这个操作。
@Entity @Table(name = "ingredient") public class Ingredient { @Id @Column(name="ingredient_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(name = "ingredient_name" ,unique = true) private String ingredientName;
我想要保存没有重复的成分。我不想要重复的条目。
我已经查看了其他答案,但没有一个解决方案对我有帮助。
在Hibernate实体类中,我们可以使用注解来定义属性的各种约束,比如长度、唯一性等。在给属性添加了unique=true
注解后,我期望该属性的值在数据库中是唯一的。
然而,当我运行代码时,我发现unique=true
并没有按照预期的方式工作。同样的值可以被重复插入到数据库中,而不会引发任何异常或错误。
这个问题的原因是,Hibernate的unique=true
属性仅在DDL(数据定义语言)生成时生效,它只会在数据库表结构被创建时应用这个约束。而对于已经存在的表,即使在实体类中使用了unique=true
,它也不会对已有的数据进行唯一性检查。
要解决这个问题,我们可以通过手动添加唯一性约束来确保数据库中的数据唯一性。具体的解决方法是在数据库中创建一个唯一索引或唯一约束,以确保该属性的值在数据库中是唯一的。
以下是一个示例的解决方法,我们可以在数据库中创建一个唯一索引来实现属性的唯一性约束:
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (属性名);
其中,表名
是实体类对应的数据库表名,约束名
是唯一索引的名称,属性名
是需要添加唯一性约束的属性名称。
通过上述方法,我们可以在已有的数据库表中添加唯一性约束,从而确保属性的值在数据库中是唯一的。这样,即使Hibernate的unique=true
在已有表中无法生效,我们仍然可以通过手动添加约束来实现属性的唯一性。
然而,当我尝试添加unique = true
时,出现了问题。它没有起到预期的作用,不会强制要求数据库中的值是唯一的。为什么unique = true
在Hibernate实体中不起作用呢?
问题出现的原因是由于数据库中已经存在重复的值。当我尝试将unique = true
添加到Hibernate实体的属性上时,Hibernate会尝试在数据库中创建一个唯一约束。然而,由于已经存在重复的值,所以无法创建该约束,从而导致unique = true
不起作用。
解决这个问题的方法是首先解决数据库中的重复值。可以通过查询数据库并删除重复的值来实现这一点。一旦数据库中不存在重复值,就可以重新运行代码,并确保unique = true
起作用。
例如,可以使用以下代码来查询数据库并删除重复值:
Listentities = sessionFactory.getCurrentSession().createQuery("SELECT e FROM Entity e GROUP BY e.property HAVING COUNT(*) > 1").list(); for (Entity entity : entities) { sessionFactory.getCurrentSession().delete(entity); }
完成此操作后,重新运行代码时,unique = true
将起作用,并强制确保数据库中的值是唯一的。
总结起来,unique = true
在Hibernate实体中不起作用的原因是数据库中已经存在重复的值。解决这个问题的方法是首先解决数据库中的重复值,然后重新运行代码以确保unique = true
起作用。
问题:为什么在Hibernate实体中使用"unique = true"不起作用?
出现原因:在使用"unique = true"时,Hibernate不遵循命名策略,导致无法生成唯一约束。
解决方法:移除"unique = true",然后通过指定的注解生成具有指定名称的唯一约束。这样做可以避免Hibernate生成的唯一约束名称超过允许的限制,并且可以使用自定义的约束名称。
具体问题可参考以下链接:https://stackoverflow.com/questions/15372654
此外,还可以参考Hibernate的bug报告:https://hibernate.atlassian.net/browse/HHH-11586