2010-05-05 19 views
51

Ben JPA-eşlenmiş varlık üzerinde çok anahtar kısıtlaması tanıtmak için çalışıyorum:JPA ek açıklamaları ile çoklu sütun kısıtlaması nasıl eklenir?

Temelde
public class InventoryItem { 
    @Id 
    private Long id; 

    @Version 
    private Long version; 

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

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

(ürün, seri) çifti benzersiz olmalıdır, ama ben sadece bu seri benzersiz olmalıdır demek için bir yol bulmuş . Farklı ürünler aynı seri numaralara sahip olabileceğinden, bu kesinlikle iyi bir fikir değildir.

JPA aracılığıyla bu kısıtlamayı oluşturmanın bir yolu var mı, yoksa el ile DB'ye oluşturmak zorunda mıyım? o Oluşturulacak için

cevap

110

Sen varlık sınıfında @Table(uniqueConstraints = ...) ek açıklama kullanarak benzersiz kısıtlamaları ilan edebilir, bu sihirli veritabanında benzersiz kısıtlama yaratmadığını da yani

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

Not, hala bir DDL gerek . Ama JPA varlık tanımlarına dayanan veritabanını oluşturmak için bir çeşit otomatik araç kullanıyormuşsunuz gibi görünüyor.

+0

gibi olmalıdır? – Rob

33

Zaten yanıtlandığı gibi, çok sütunlu dizin @Table ek açıklaması kullanılarak eklenebilir. Ancak, columnNames, sınıf özniteliği yerine gerçek DB sütunlarının adı olmalıdır. sütunu, aşağıdaki gibidir Yani, eğer:

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

Sonra @Table açıklama bu tür şeylerin zaten yerinde kısıtlamaları ile varolan veritabanı için gerekli midir aşağıdaki

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

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