JPA ek açıklamalarıyla çok sütunlu kısıtlama nasıl eklenir?


91

JPA eşlemeli bir varlığa çok anahtarlı bir kısıtlama getirmeye çalışıyorum:

public class InventoryItem {
    @Id
    private Long id;

    @Version 
    private Long version;

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

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

Temel olarak (ürün, seri) çifti benzersiz olmalı, ancak yalnızca serinin benzersiz olması gerektiğini söylemenin bir yolunu buldum. Farklı ürünler aynı seri numaralarına sahip olabileceğinden, bu kesinlikle iyi bir fikir değildir.

Bu kısıtlamayı JPA aracılığıyla oluşturmanın bir yolu var mı yoksa bunu DB'ye manuel olarak oluşturmak zorunda mıyım?

Yanıtlar:


191

@Table(uniqueConstraints = ...)Varlık sınıfınızdaki açıklamayı kullanarak benzersiz kısıtlamalar bildirebilirsiniz , örn.

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

Bunun veritabanında sihirli bir şekilde benzersiz kısıtlama yaratmadığını unutmayın, oluşturulması için yine de bir DDL'ye ihtiyacınız vardır. Ancak, JPA varlık tanımlarına dayalı olarak veritabanı oluşturmak için bir tür otomatik araç kullanıyormuşsunuz gibi görünüyor.


1
Bu tür bir şey, kısıtlamaları olan mevcut bir veritabanı için gerekli midir?
Rob

Kısıtlamanın oluşturulacağına inanıyorum, JPA sağlayıcısı veri tabanını oluşturuyor.
AlanObject

Benzersizlik (ürün kimliği) sütun ve (seri) sütun için mi yoksa toplamda 2 sütunun kısıtlaması için mi (ürün kimliği, seri)?
P Satish Patro

69

Daha önce cevaplandığı gibi, çok sütunlu dizin @Tableaçıklama kullanılarak eklenebilir . Ancak, columnNamessınıf özniteliği değil, gerçek DB sütunlarının adı olması gerekir. Öyleyse, sütun aşağıdaki gibiyse:

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

Daha sonra @Tableek açıklama aşağıdaki gibi olmalıdır

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

10
Bu çok önemli bir açıklamadır: nesne adları değil tablo adları.
Calabacin

1
Benzersizlik (ürün kimliği) sütun ve (seri) sütun için mi yoksa toplamda 2 sütunun kısıtlaması için mi (ürün kimliği, seri)?
P Satish Patro

Kotlin: Kotlin için bir örnek bulmak için bu cevaba bir göz atın: stackoverflow.com/a/47000044/285431
Dirk

Sözdizimi hatası. @Table ek açıklamasında kapanış parantezini kaçırıyorsunuz.
Evvo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.