【问题标题】:Hibernate - unique column constraint being ignoredHibernate - 唯一列约束被忽略
【发布时间】:2010-11-05 10:47:16
【问题描述】:

我有一个 MySQL 表来保存标签(即像 Stack Overflow 上使用的那些)。它只是有一个 id (pk) 和一个标签列来保存标签本身。

我的 Tag 实体的带注释的 get 方法如下所示。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
public int getId() {
    return this.id;
}

@Column(name = "tag", unique = true, nullable = false)
public String getTag() {
    return this.tag;
}

我在标签上使用了唯一的列约束,因为给定标签的行数不应该超过一行。然而,Hibernate 似乎忽略了这一点,即我可以多次保存完全相同的标签,它只是创建一个新行而不是抛出异常。

我是否遗漏了什么或者这应该有效吗?

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

    来自UniqueConstraint 的JavaDoc(@Colunm 上的unique=true 只是一个捷径):

    此注解用于指定在生成的主表或辅助表的 DDL 中包含唯一约束。

    所以它似乎并没有在插入时强制执行唯一性。无论如何,您都应该在数据库中创建一个唯一约束。

    【讨论】:

      【解决方案2】:

      你错过了这只是一个信息。

      您还应该在数据库中的列上添加约束。

      【讨论】:

      • 感谢您的回答。顺便说一句,这不是很可笑吗?!
      • 不,不是。数据库会很快验证该实体是唯一的。 ORM 不可能这么快。这就是为什么这很有意义。
      • 我的意思是,我使用该注释并且它不会在数据库中创建对应的唯一约束,这不是很荒谬吗?这就是我最初理解它的行为方式,尽管我做了几个实验,似乎只有当我使用某些数据库(如 HSQL)时,它才将“unique = true”反映到模式中,相同的代码会在以下情况下产生 MySQL 约束我切换数据库配置。
      • 没有。该工具可以为您生成一个将创建数据库的脚本。然后将添加约束。但是,当您创建映射时,您可以将 DB 结构反映到您的应用程序对象中。
      • 它似乎对某些数据库产生了限制,而对其他数据库则没有。有意义的是,注释反映在相应 SQL 约束的生成中。可以在脚本中执行此操作以创建数据库。我通常根本看不到后者,因为我通过 Maven 使用 JPA/Hibernate。
      猜你喜欢
      • 1970-01-01
      • 2010-10-17
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 2010-10-17
      • 2019-08-06
      相关资源
      最近更新 更多