จะแนะนำข้อ จำกัด หลายคอลัมน์ด้วยคำอธิบายประกอบ JPA ได้อย่างไร


91

ฉันกำลังพยายามแนะนำข้อ จำกัด หลายคีย์ในเอนทิตีที่แมป 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 ด้วยตนเอง

คำตอบ:


192

คุณสามารถประกาศข้อ จำกัด เฉพาะโดยใช้@Table(uniqueConstraints = ...)คำอธิบายประกอบในคลาสเอนทิตีของคุณเช่น

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

โปรดทราบว่าสิ่งนี้ไม่ได้สร้างข้อ จำกัด เฉพาะในฐานข้อมูลอย่างน่าอัศจรรย์คุณยังต้องมี DDL เพื่อสร้างข้อ จำกัด แต่ดูเหมือนว่าคุณกำลังใช้เครื่องมืออัตโนมัติบางประเภทในการสร้างฐานข้อมูลตามนิยามเอนทิตี JPA


1
สิ่งนี้จำเป็นสำหรับฐานข้อมูลที่มีอยู่ซึ่งมีข้อ จำกัด อยู่แล้วหรือไม่?
Rob

ฉันเชื่อว่าข้อ จำกัด จะถูกสร้างขึ้นผู้ให้บริการ JPA กำลังสร้างฐานข้อมูล
AlanObject

ความเป็นเอกลักษณ์มีไว้สำหรับคอลัมน์ (productId) และคอลัมน์ (อนุกรม) หรือสำหรับข้อ จำกัด ของ 2 คอลัมน์ทั้งหมด (productId, serial)?
P Satish Patro

69

ตามที่ตอบไปแล้วดัชนีหลายคอลัมน์สามารถเพิ่มได้โดยใช้@Tableคำอธิบายประกอบ อย่างไรก็ตามcolumnNamesต้องเป็นชื่อของคอลัมน์ DB จริงไม่ใช่แอตทริบิวต์คลาส ดังนั้นหากคอลัมน์เป็นดังนี้:

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

จากนั้น@Tableคำอธิบายประกอบควรเป็นดังต่อไปนี้

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

10
นี่เป็นการชี้แจงที่สำคัญมาก: ชื่อตารางและไม่ใช่ชื่อวัตถุ
Calabacin

1
ความเป็นเอกลักษณ์มีไว้สำหรับคอลัมน์ (productId) และคอลัมน์ (อนุกรม) หรือสำหรับข้อ จำกัด ของ 2 คอลัมน์ทั้งหมด (productId, serial)?
P Satish Patro

Kotlin: ลองดูคำตอบนี้เพื่อหาตัวอย่างสำหรับ kotlin: stackoverflow.com/a/47000044/285431
Dirk

ข้อผิดพลาดทางไวยากรณ์ คุณไม่มีวงเล็บปิดในคำอธิบายประกอบ @Table
Evvo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.