Ответ
Да, PRIMARY KEY может быть составным (composite), то есть состоять из двух или более столбцов таблицы. Уникальность записи в таком случае обеспечивается комбинацией значений этих столбцов.
Пример создания в SQL:
CREATE TABLE OrderItems (
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT,
PRIMARY KEY (order_id, product_id) -- Составной первичный ключ
);
Особенности составного PRIMARY KEY:
- Уникальность: Комбинация
(order_id, product_id)должна быть уникальна. - NOT NULL: Все столбцы, входящие в ключ, неявно получают ограничение
NOT NULL. - Индекс: Создается уникальный индекс по всем столбцам ключа, что ускоряет поиск и операции
JOIN.
Реализация в JPA/Hibernate:
-
С помощью
@IdClass:@Entity @IdClass(OrderItemId.class) public class OrderItem { @Id private Long orderId; @Id private Long productId; private Integer quantity; } public class OrderItemId implements Serializable { private Long orderId; private Long productId; // Обязательно переопределить equals() и hashCode() } -
С помощью
@EmbeddedId(часто предпочтительнее):@Entity public class OrderItem { @EmbeddedId private OrderItemId id; private Integer quantity; } @Embeddable public class OrderItemId implements Serializable { private Long orderId; private Long productId; // equals() и hashCode() }