为什么在Hibernate实体中的"unique = true"不起作用?

7 浏览
0 Comments

为什么在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

  1. 在运行spring boot应用程序后,我尝试在MySQL workbench中手动添加唯一约束-不起作用
  2. 我添加了以下代码-不起作用

    @Table(name = "ingredient", uniqueConstraints=@UniqueConstraint(name="uk_ingredient_name",columnNames="ingredient_name"))
    @Column(name = "ingredient_name" ,unique = true)
    private String ingredientName;

  1. 尝试在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; 

我想要保存没有重复的成分。我不想要重复的条目。

我已经查看了其他答案,但没有一个解决方案对我有帮助。

0
0 Comments

在Hibernate实体类中,我们可以使用注解来定义属性的各种约束,比如长度、唯一性等。在给属性添加了unique=true注解后,我期望该属性的值在数据库中是唯一的。

然而,当我运行代码时,我发现unique=true并没有按照预期的方式工作。同样的值可以被重复插入到数据库中,而不会引发任何异常或错误。

这个问题的原因是,Hibernate的unique=true属性仅在DDL(数据定义语言)生成时生效,它只会在数据库表结构被创建时应用这个约束。而对于已经存在的表,即使在实体类中使用了unique=true,它也不会对已有的数据进行唯一性检查。

要解决这个问题,我们可以通过手动添加唯一性约束来确保数据库中的数据唯一性。具体的解决方法是在数据库中创建一个唯一索引或唯一约束,以确保该属性的值在数据库中是唯一的。

以下是一个示例的解决方法,我们可以在数据库中创建一个唯一索引来实现属性的唯一性约束:

ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (属性名);

其中,表名是实体类对应的数据库表名,约束名是唯一索引的名称,属性名是需要添加唯一性约束的属性名称。

通过上述方法,我们可以在已有的数据库表中添加唯一性约束,从而确保属性的值在数据库中是唯一的。这样,即使Hibernate的unique=true在已有表中无法生效,我们仍然可以通过手动添加约束来实现属性的唯一性。

0
0 Comments

然而,当我尝试添加unique = true时,出现了问题。它没有起到预期的作用,不会强制要求数据库中的值是唯一的。为什么unique = true在Hibernate实体中不起作用呢?

问题出现的原因是由于数据库中已经存在重复的值。当我尝试将unique = true添加到Hibernate实体的属性上时,Hibernate会尝试在数据库中创建一个唯一约束。然而,由于已经存在重复的值,所以无法创建该约束,从而导致unique = true不起作用。

解决这个问题的方法是首先解决数据库中的重复值。可以通过查询数据库并删除重复的值来实现这一点。一旦数据库中不存在重复值,就可以重新运行代码,并确保unique = true起作用。

例如,可以使用以下代码来查询数据库并删除重复值:

List entities = 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起作用。

0
0 Comments

问题:为什么在Hibernate实体中使用"unique = true"不起作用?

出现原因:在使用"unique = true"时,Hibernate不遵循命名策略,导致无法生成唯一约束。

解决方法:移除"unique = true",然后通过指定的注解生成具有指定名称的唯一约束。这样做可以避免Hibernate生成的唯一约束名称超过允许的限制,并且可以使用自定义的约束名称。

具体问题可参考以下链接:https://stackoverflow.com/questions/15372654

此外,还可以参考Hibernate的bug报告:https://hibernate.atlassian.net/browse/HHH-11586

0