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

Відповіді:


190

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

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

Зауважте, що це магічним чином не створює унікальне обмеження в базі даних, вам все одно потрібна DDL для її створення. Але, схоже, ви використовуєте якийсь автоматизований інструмент для створення бази даних на основі визначень сутності JPA.


1
Чи потрібна така річ для існуючої бази даних з уже встановленими обмеженнями?
Роб

Я вірю, що буде створено обмеження, постачальник JPA створює базу даних.
AlanObject

Унікальність полягає у стовпці (productId) та стовпці (serial) або в обмеженні на 2 стовпці (productId, serial)?
P

69

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

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

Тоді @Tableанотація повинна виглядати наступною

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

10
Це дуже важливе уточнення: назви таблиць, а не імена об’єктів.
Калабацин

1
Унікальність полягає у стовпці (productId) та стовпці (serial) або в обмеженні на 2 стовпці (productId, serial)?
P

Котлін: Подивіться на цю відповідь знайти приклад для Котлин: stackoverflow.com/a/47000044/285431
Дірка

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