web-dev-qa-db-ja.com

JPAアノテーションで複数列制約を導入する方法は?

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に手動で作成する必要がありますか?

76
plouh

エンティティクラスで@Table(uniqueConstraints = ...)アノテーションを使用して一意の制約を宣言できます。

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

これにより、データベースに一意の制約が魔法のように作成されるわけではないことに注意してください。作成するには、まだDDLが必要です。しかし、JPAエンティティ定義に基づいてデータベースを作成するための何らかの自動ツールを使用しているようです。

150
psp

既に回答したように、@Tableアノテーションを使用して複数列のインデックスを追加できます。ただし、columnNamesは、クラス属性ではなく、実際のDB列の名前である必要があります。そのため、列が次のような場合:

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

@Tableアノテーションは次のようになります

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