Создание составных уникальных ограничений на несколько столбцов - PullRequest
52 голосов
/ 23 ноября 2011

Это моя модель:

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

Каждый номер книги начинается с 1 на автора и увеличивается вверх.Таким образом, у нас будут Книги 1,2,3 Джона Гришама, Книга 1..5 Джорджа Мартина и т. Д.у нас нет двух книг с одинаковым номером одного и того же автора?Аналогично @Column(unique = true), но ограничение применяется только к составному из Author X number?

Ответы [ 3 ]

106 голосов
/ 23 ноября 2011

Использование @UniqueConstraint:

@Table(
    uniqueConstraints=
        @UniqueConstraint(columnNames={"author_id", "number"})
)
@Entity
class Book extends Model {
   @ManyToOne
   @JoinColumn(name = "author_id")
   User author;
   int number; 
} 
4 голосов
/ 14 сентября 2015

Когда таблица создается ранее, ее необходимо удалить. Уникальный ключ не добавляется в существующую таблицу.

0 голосов
/ 20 марта 2018

Как ответил @axtavt, вы можете использовать @UniqueConstraint подход.Но в случае существующей таблицы есть несколько возможностей.Не всегда, но в целом вы можете получить SQLException .Причина в том, что в вашей таблице могут быть некоторые данные, которые противоречат ключу «Составной уникальный».Поэтому все, что вы можете сделать, чтобы избежать этого, - это сначала вручную проверить (используя простой SQL-запрос), подходит ли для всех ваших существующих данных составной уникальный ключ.Если нет, конечно, удалите данные, вызывающие нарушение.(Другой способ - удалить всю существующую таблицу, но ее можно использовать только в том случае, если она не содержит важных данных).

...