Как ввести ограничение нескольких столбцов с помощью аннотаций JPA? - программирование
Подтвердить что ты не робот

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

Я пытаюсь ввести ограничение с несколькими ключами для 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 или я вынужден вручную создать его в DB?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Затем аннотация @Table должна выглядеть следующим образом:

@Table(uniqueConstraints=
       @UniqueConstraint(columnNames = {"product_id", "serial"})