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

2 62

2 ответа:

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

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

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

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

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

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

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