Я хочу создать объект, который имеет автоматически сгенерированный первичный ключ, а также уникальный составной ключ, состоящий из двух других полей. Как мне сделать это в 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;
}




Вы можете использовать @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: Согласно спецификации EJB3.0, Мишель дал правильную форму.
Используйте @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.
Тогда ваша реализация JPA неверна. Спецификация JPA2, §11.1.49 columnNames - это «Массив имен столбцов, которые составляют ограничение» (ограничение, а не ограничения).
В чем проблема с использованием составного ключа в качестве внешнего ключа?