web-dev-qa-db-de.com

Wie füge ich eine mehrspaltige Einschränkung mit JPA-Anmerkungen ein?

Ich versuche, eine Einschränkung für mehrere Schlüssel für eine Entität mit JPA-Zuordnung einzuführen:

public class InventoryItem {
    @Id
    private Long id;

    @Version 
    private Long version;

    @ManyToOne
    @JoinColumn("productId")
    private Product product;

    @Column(nullable=false);
    private long serial;
}

Grundsätzlich sollte ein (Produkt-, Serien-) Paar eindeutig sein, aber ich habe nur einen Weg gefunden, zu sagen, dass eine Seriennummer eindeutig sein sollte. Dies ist offensichtlich keine gute Idee, da verschiedene Produkte möglicherweise die gleichen Seriennummern haben.

Gibt es eine Möglichkeit, diese Einschränkung über JPA zu generieren, oder muss ich sie manuell für die Datenbank erstellen?

76
plouh

Sie können eindeutige Einschränkungen mit der Annotation @Table(uniqueConstraints = ...) in Ihrer Entitätsklasse deklarieren, d. H.

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

Beachten Sie, dass dadurch die eindeutige Einschränkung in der Datenbank nicht auf magische Weise erstellt wird. Sie benötigen dennoch eine DDL, um sie zu erstellen. Anscheinend verwenden Sie jedoch ein automatisiertes Tool zum Erstellen der Datenbank auf der Grundlage von JPA-Entitätsdefinitionen.

150
psp

Wie bereits beantwortet, kann ein mehrspaltiger Index mit der Annotation @Table Hinzugefügt werden. columnNames muss jedoch der Name der tatsächlichen DB-Spalten sein, nicht das Klassenattribut. Also, wenn die Spalte wie folgt aussieht:

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

Dann sollte die Annotation @Table Wie folgt aussehen

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