@UniqueConstraint คำอธิบายประกอบใน Java


168

ฉันมี Java bean ตอนนี้ฉันต้องการแน่ใจว่าฟิลด์ควรไม่ซ้ำกัน

ฉันกำลังใช้รหัสต่อไปนี้:

@UniqueConstraint(columnNames={"username"})
public String username;

แต่ฉันได้รับข้อผิดพลาด:

@UniqueConstraint is dissallowed for this location

วิธีที่เหมาะสมในการใช้ข้อ จำกัด ที่ไม่ซ้ำกันคืออะไร

หมายเหตุ:ฉันใช้กรอบการเล่น


15
"แต่ฉันได้รับข้อผิดพลาด" มักจะระบุสิ่งที่ผิดพลาดที่คุณได้รับในคำถาม คุณมีข้อมูลที่เกี่ยวข้องซึ่งอาจช่วยเราในการแก้ปัญหาของคุณได้เป็นอย่างดี
Jon Skeet

เป็นไปได้ไหมที่จะใช้คำอธิบายประกอบ @id?
Albinoswordfish

คำตอบ:


415

เพื่อให้แน่ใจว่าค่าฟิลด์ไม่ซ้ำกันคุณสามารถเขียน

@Column(unique=true)
String username;

คำอธิบายประกอบ @UniqueConstraint ใช้สำหรับการเพิ่มความคิดเห็นคีย์ที่ไม่ซ้ำหลายรายการในระดับตารางซึ่งเป็นสาเหตุที่คุณได้รับข้อผิดพลาดเมื่อนำไปใช้กับฟิลด์

ข้อมูลอ้างอิง (JPA TopLink):


17
เป็นเรื่องสำคัญที่จะต้องทราบว่าจะใช้งานได้ต่อเมื่อคุณปล่อยให้ JPA สร้างตารางของคุณ
naoru

118

คุณสามารถใช้ในระดับชั้นเรียนด้วยไวยากรณ์ต่อไปนี้

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"username"})})
public class SomeEntity {
    @Column(name = "username")
    public String username;
}

42

ขณะนี้ฉันใช้กรอบการเล่นด้วยการจำศีลและไฮเบอร์เนต JPA 2.0 และรุ่นนี้ใช้งานได้โดยไม่มีปัญหา

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames = {"id_1" , "id_2"})})
public class class_name {

@Id
@GeneratedValue
public Long id;

@NotNull
public Long id_1;

@NotNull
public Long id_2;

}

หวังว่ามันจะช่วย


20

หมายเหตุ:ใน Kotlin ไวยากรณ์สำหรับการประกาศอาร์เรย์ในหมายเหตุประกอบจะใช้arrayOf(...)แทน{...}

@Entity
@Table(uniqueConstraints=arrayOf(UniqueConstraint(columnNames=arrayOf("book", "chapter_number"))))
class Chapter(@ManyToOne var book:Book,
              @Column var chapterNumber:Int)

หมายเหตุ:ตั้งแต่ Kotlin 1.2 เป็นไปได้ที่จะใช้[...]ไวยากรณ์เพื่อให้รหัสกลายเป็นเรื่องง่ายขึ้นมาก

@Entity
@Table(uniqueConstraints=[UniqueConstraint(columnNames=["book", "chapter_number"])])
class Chapter(@ManyToOne var book:Book,
              @Column var chapterNumber:Int)

13

วิธีที่ 1:

@Entity

@Table(name = "table_name", uniqueConstraints={@UniqueConstraint(columnNames = "column1"),@UniqueConstraint(columnNames = "column2")})

- ที่นี่ทั้งคอลัมน์ 1 และคอลัมน์ 2 ทำหน้าที่เป็นข้อ จำกัด ที่ไม่ซ้ำกันแยกกัน ตัวอย่าง: หากใดก็ตามที่ค่าของคอลัมน์ 1 หรือค่าคอลัมน์ 2 ตรงกันคุณจะได้รับข้อผิดพลาด UNIQUE_CONSTRAINT

วิธีที่ 2:

@Entity

@Table(name = "table_name", uniqueConstraints={@UniqueConstraint(columnNames ={"column1","column2"})})

- ที่นี่ทั้งสองค่ารวมกันของคอลัมน์ 1 และคอลัมน์ 2 ทำหน้าที่เป็นข้อ จำกัด ที่ไม่ซ้ำกัน


4
   @Entity @Table(name = "stock", catalog = "mkyongdb",
   uniqueConstraints = @UniqueConstraint(columnNames =
   "STOCK_NAME"),@UniqueConstraint(columnNames = "STOCK_CODE") }) public
   class Stock implements java.io.Serializable {

   }

ข้อ จำกัด ที่ไม่ซ้ำกันใช้เฉพาะสำหรับการสร้างคีย์ผสมซึ่งจะไม่ซ้ำกันมันจะแสดงตารางเป็นคีย์หลักรวมกันเป็นเอกลักษณ์


3

คุณสามารถใช้ @UniqueConstraint ในระดับชั้นเรียนสำหรับคีย์หลักแบบรวมในตาราง ตัวอย่างเช่น:

 @Entity
 @Table(name = "PRODUCT_ATTRIBUTE", uniqueConstraints = {
       @UniqueConstraint(columnNames = {"PRODUCT_ID"}) })

ProductAttribute ระดับสาธารณะ {}


1

คำอธิบายประกอบที่ไม่ซ้ำกันควรอยู่เหนือประกาศคุณสมบัติ UniqueContraints ไปที่คำอธิบายประกอบ @Table ด้านบนการประกาศคลาสข้อมูล ดูด้านล่าง:

@Entity
@Table(uniqueConstraints= arrayOf(UniqueConstraint(columnNames = arrayOf("col_1", "col_2"))))
data class Action(
        @Id @GeneratedValue @Column(unique = true)
        val id: Long?,
        val col_1: Long?,
        val col_2: Long?,
)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.