【问题标题】:Creating a composite Unique constraints on multiple columns在多列上创建复合唯一约束
【发布时间】:2012-01-04 23:11:16
【问题描述】:

这是我的模型:

class User {...}
class Book {
  User author;
  int number;
}

每本书的编号从每位作者 1 开始,然后向上递增。所以我们会有 John Grisham 的 Books 1,2,3,George Martin 的 Book 1..5 等等......

我可以在Book 上设置一个独特的约束条件,以保证我们没有两本同一作者的相同编号的书吗?类似于@Column(unique = true),但约束只适用于Author X number的复合?

【问题讨论】:

标签: java jpa playframework persistence


【解决方案1】:

使用@UniqueConstraint:

@Table(
    uniqueConstraints=
        @UniqueConstraint(columnNames={"author_id", "number"})
)
@Entity
class Book extends Model {
   @ManyToOne
   @JoinColumn(name = "author_id")
   User author;
   int number; 
} 

【讨论】:

  • 如何让作者和数字@id 像 FK 一样??
  • 对于多个复合 uniqueConstraints,语法为 @Table(uniqueConstraints = {@UniqueConstraint(columnNames = { "field1", "field2", "field3" }), @UniqueConstraint(columnNames = {" field4", "field5"})}) )
  • 添加这个唯一约束后,当我部署应用程序时,hibernate 不再能够创建我的表。你能帮忙吗?
  • 唯一性是针对(productId)列和(serial)列还是针对总共2列(productId,serial)的约束?
【解决方案2】:

以前创建表时,需要将其删除。唯一键未添加到现有表中。

【讨论】:

    【解决方案3】:

    正如@axtavt 已回答的那样,您可以使用@UniqueConstraint 方法。但在现有表的情况下,有多种可能性。并非总是如此,但通常您可能会收到 SQLException。 原因是您的表中可能有一些与复合唯一键冲突的现有数据。因此,为了避免这种情况,您所能做的就是首先手动检查(通过使用简单的 SQL 查询)是否所有现有数据都适合使用复合唯一键。如果不是,当然,删除导致违规的数据。 (另一种方法是删除整个现有表,但只能使用它不包含任何重要数据)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 2012-07-30
      相关资源
      最近更新 更多