在多个列上创建复合唯一约束

时间:2011-11-23 16:46:32

标签: java jpa playframework persistence

这是我的模特:

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

每位作者的每本书编号从1开始,并向上递增。因此,我们将获得John Grisham的书籍1,2,3,George Martin的书籍1 ...等等......

我可以在Book上放置一个独特的约束,这可以保证我们没有两本同一作者的同一号码的书吗?与@Column(unique = true)类似,但约束仅适用于Author X number

的合并

3 个答案:

答案 0 :(得分:101)

使用@UniqueConstraint

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

答案 1 :(得分:4)

以前创建表时,必须将其删除。唯一键不会添加到现有表中。

答案 2 :(得分:0)

正如@axtavt所回答的那样,您可以使用var result = myObj.concat(anotherObj); 方法。但是在现有表格的情况下,有多种可能性。并非所有时间,但一般情况下,您可能会得到 SQLException 。 原因是您的表中可能存在一些与Composite Unique键冲突的现有数据。所以你要做的就是首先手动检查(通过使用简单的SQL查询),如果所有现有数据都适合使用Composite Unique Key。当然,如果没有,则删除导致违规的数据。 (另一种方法是删除整个现有表,但只能使用它不包含任何重要数据)。