Составные ключи в JPA

Я хочу создать объект, который имеет автоматически сгенерированный первичный ключ, а также уникальный составной ключ, состоящий из двух других полей. Как мне сделать это в JPA?
Я хочу сделать это, потому что первичный ключ должен использоваться как внешний ключ в другой таблице, и делать его составным было бы нехорошо.

В следующем фрагменте мне нужно, чтобы команда и модель были уникальными. pk - это, конечно, первичный ключ.

@Entity
@Table(name = "dm_action_plan")
public class ActionPlan {
    @Id
    private int pk;
    @Column(name = "command", nullable = false)
    private String command;
    @Column(name = "model", nullable = false)
    String model;
}

В чем проблема с использованием составного ключа в качестве внешнего ключа?

Tom Anderson 23.04.2011 14:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
1
8 130
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать @UniqueConstraint примерно так:

@Entity
@Table(name = "dm_action_plan",
       uniqueConstraints = { @UniqueConstraint(columnNames= "command","model") } )
public class ActionPlan {
    @Id
    private int pk;

    @Column(name = "command", nullable = false)
    private String command;

    @Column(name = "model", nullable = false)
    String model;
}

Это позволит вашей реализации JPA сгенерировать DDL для уникального ограничения.

Правильная форма выглядит так: @Table (name = "dm_action_plan") @UniqueConstraint (columnNames = {"command", "model"})

homaxto 18.09.2008 13:01

homaxto: Согласно спецификации EJB3.0, Мишель дал правильную форму.

Nicolas 18.09.2008 13:13

Используйте @GeneratedValue, чтобы указать, что ключ будет сгенерирован, и @UniqueConstraint, чтобы выразить уникальность

@Entity
@Table(name = "dm_action_plan"
       uniqueConstraint = @UniqueConstraint({"command", "model"})
)
public class ActionPlan {
    @Id
    @GeneratedValue
    private int pk;
    @Column(name = "command", nullable = false)
    private String command;
    @Column(name = "model", nullable = false)
    String model;
}

Это не создаст составного ограничения. Он создаст два ограничения, каждое для каждого имени столбца, которое вы отметили в @UniqueConstraint.

mannysz 29.07.2011 23:38

Тогда ваша реализация JPA неверна. Спецификация JPA2, §11.1.49 columnNames - это «Массив имен столбцов, которые составляют ограничение» (ограничение, а не ограничения).

Nicolas 30.07.2011 10:43

Другие вопросы по теме