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?
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.
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"})