Как ввести ограничение нескольких столбцов с аннотациями JPA? - PullRequest
71 голосов
/ 05 мая 2010

Я пытаюсь ввести многоключевое ограничение для объекта, сопоставленного 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 ]

144 голосов
/ 05 мая 2010

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

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

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

55 голосов
/ 14 августа 2014

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

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

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

@Table(uniqueConstraints=
       @UniqueConstraint(columnNames = {"product_id", "serial"}) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...