Подтвердить что ты не робот

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

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

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

Каждый номер книги начинается с 1 на автора и увеличивается вверх. Итак, у нас будут книги 1,2,3 от Джона Гришама, Книга 1..5 Джорджа Мартина и т.д.

Есть ли уникальное ограничение, которое я могу разместить на Book, что гарантировало бы, что у нас нет двух книг с одинаковым числом того же автора? Подобно @Column(unique = true), но ограничение применяется только к композиту Author X number?

4b9b3361

Ответ 1

Используйте @UniqueConstraint:

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

Ответ 2

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

Ответ 3

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