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を介してこの制約を生成する方法はありますか、それともDBに手動で作成する必要がありますか?
エンティティクラスで@Table(uniqueConstraints = ...)
アノテーションを使用して一意の制約を宣言できます。
@Entity
@Table(uniqueConstraints={
@UniqueConstraint(columnNames = {"productId", "serial"})
})
public class InventoryItem {
...
}
これにより、データベースに一意の制約が魔法のように作成されるわけではないことに注意してください。作成するには、まだDDLが必要です。しかし、JPAエンティティ定義に基づいてデータベースを作成するための何らかの自動ツールを使用しているようです。
既に回答したように、@Table
アノテーションを使用して複数列のインデックスを追加できます。ただし、columnNames
は、クラス属性ではなく、実際のDB列の名前である必要があります。そのため、列が次のような場合:
@Column(name="product_id")
Long productId;
@Table
アノテーションは次のようになります
@Table(uniqueConstraints=
@UniqueConstraint(columnNames = {"product_id", "serial"})