在多列上创建复合 Unique 约束

这是我的模型:

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

每本书的编号从每个作者1开始,向上递增。所以我们有约翰 · 格里森姆的第一,第二,第三卷,第一卷。.5由乔治马丁等。.

有没有一个独特的限制,我可以放在 Book,这将保证我们不会有两本书,由同一作者相同的数量?类似于 @Column(unique = true),但是这个约束只适用于 Author X number

55144 次浏览

使用 @UniqueConstraint:

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

以前创建表时,需要删除该表。唯一键不会添加到现有表中。

正如@axtavt 所回答的,您可以使用 @UniqueConstraint方法。但是对于现有的表,存在多种可能性。不是所有的时候,但一般来说,你可能会得到一个 SQLException 异常。 原因是您的表中可能有一些与 CompositUnique 键冲突的现有数据。因此,要避免这种情况,您所能做的就是首先手动检查(通过使用简单的 SQL 查询)是否所有现有数据都适合使用复合唯一键。当然,如果没有,则删除导致冲突的数据。(另一种方法是删除整个现有表,但只能使用不包含任何重要数据的表)。