Как ввести ограничение нескольких столбцов с аннотациями 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, или я вынужден вручную создать его в БД?

Ответы:


191

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

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

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


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"}) 

10
Это очень важное уточнение: имена таблиц, а не имена объектов.
Calabacin

1
Уникальность для столбца (productId) и столбца (serial) или для ограничения в 2 столбца всего (productId, serial)?
P Satish Patro

Котлин: взгляните на этот ответ, чтобы найти пример для котлина: stackoverflow.com/a/47000044/285431
Дирк

Синтаксическая ошибка. Вам не хватает закрывающей скобки в аннотации @Table.
Evvo
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.