Как ввести ограничение нескольких столбцов с аннотациями JPA?

91

Я пытаюсь ввести ограничение с несколькими ключами для объекта, отображаемого в JPA:

public class InventoryItem {
    @Id
    private Long id;

    @Version 
    private Long version;

    @ManyToOne
    @JoinColumn("productId")
    private Product product;

    @Column(nullable=false);
    private long serial;
}

По сути, пара (продукт, серийный номер) должна быть уникальной, но я нашел только способ сказать, что серийный номер должен быть уникальным. Очевидно, что это не очень хорошая идея, поскольку разные продукты могут иметь одинаковые серийные номера.

Есть ли способ создать это ограничение через JPA, или я вынужден вручную создать его в БД?

Plouh
источник

Ответы:

191

Вы можете объявить уникальные ограничения, используя @Table(uniqueConstraints = ...)аннотацию в своем классе сущности, т.е.

@Entity
@Table(uniqueConstraints={
    @UniqueConstraint(columnNames = {"productId", "serial"})
}) 
public class InventoryItem {
    ...
}

Обратите внимание, что это не волшебным образом создает уникальное ограничение в базе данных, вам все равно нужен DDL для его создания. Но похоже, что вы используете какой-то автоматический инструмент для создания базы данных на основе определений сущностей JPA.

psp
источник
1
Нужны ли подобные вещи для существующей базы данных с уже имеющимися ограничениями?
Роб
Я верю, что ограничение будет создано провайдером JPA, который создает базу данных.
AlanObject
Уникальность для столбца (productId) и столбца (serial) или для ограничения в 2 столбца всего (productId, serial)?
P Satish Patro
69

Как уже было сказано, многостолбцовый индекс можно добавить с помощью @Tableаннотации. Однако это columnNamesдолжно быть имя фактических столбцов БД, а не атрибут класса. Итак, если столбец выглядит следующим образом:

@Column(name="product_id")
Long productId;

Тогда @Tableаннотация должна быть такой:

@Table(uniqueConstraints=
       @UniqueConstraint(columnNames = {"product_id", "serial"}) 
SJha
источник
10
Это очень важное уточнение: имена таблиц, а не имена объектов.
Calabacin
1
Уникальность для столбца (productId) и столбца (serial) или для ограничения в 2 столбца всего (productId, serial)?
P Satish Patro
Котлин: взгляните на этот ответ, чтобы найти пример для котлина: stackoverflow.com/a/47000044/285431
Дирк
Синтаксическая ошибка. Вам не хватает закрывающей скобки в аннотации @Table.
Evvo