@ UniqueConstraint-Annotation in Java


168

Ich habe eine Java-Bohne. Jetzt möchte ich sicher sein, dass das Feld eindeutig sein sollte.

Ich verwende den folgenden Code:

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

Aber ich bekomme einen Fehler:

@UniqueConstraint is dissallowed for this location

Was ist der richtige Weg, um eindeutige Einschränkungen zu verwenden?

Hinweis: Ich verwende das Play Framework.


15
"Aber ich bekomme einen Fehler." Geben Sie immer an, welchen Fehler Sie in der Frage erhalten. Sie haben relevante Informationen, die uns bei der Lösung Ihres Problems helfen können - behalten Sie sie nicht für sich.
Jon Skeet

Wäre es möglich, die Annotation @id zu verwenden?
Albinoswordfish

Antworten:


413

Um sicherzustellen, dass ein Feldwert eindeutig ist, können Sie schreiben

@Column(unique=true)
String username;

Die Annotation @UniqueConstraint dient zum Annotieren mehrerer eindeutiger Schlüssel auf Tabellenebene. Aus diesem Grund wird beim Anwenden auf ein Feld eine Fehlermeldung angezeigt.

Referenzen (JPA TopLink):


16
Es ist wichtig zu beachten, dass es nur funktioniert, wenn Sie JPA Ihre Tabellen erstellen lassen
naoru

118

Sie können auf Klassenebene mit der folgenden Syntax verwenden

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

41

Ich verwende derzeit auch das Play Framework mit Hibernate- und JPA 2.0-Annotation und dieses Modell funktioniert ohne Probleme

@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;

}

Hoffe es hat geholfen.


20

Hinweis: In Kotlin wird arrayOf(...)anstelle von die Syntax zum Deklarieren der Arrays in Annotationen verwendet{...}

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

Hinweis: Ab Kotlin 1.2 ist es möglich, die [...]Syntax zu verwenden, damit der Code viel einfacher wird

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

13

Weg1:

@Entity

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

- Hier fungieren sowohl Spalte1 als auch Spalte2 separat als eindeutige Einschränkungen. Beispiel: Wenn der Wert von Spalte1 oder Spalte2 zu irgendeinem Zeitpunkt übereinstimmt, wird der Fehler UNIQUE_CONSTRAINT angezeigt.

Weg2:

@Entity

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

- Hier wirken die kombinierten Werte von Spalte1 und Spalte2 als eindeutige Einschränkungen


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

   }

Eindeutige Einschränkungen, die nur zum Erstellen eines zusammengesetzten Schlüssels verwendet werden, der eindeutig ist. Die Tabelle wird als Primärschlüssel dargestellt und als eindeutig kombiniert.


3

Sie können @UniqueConstraint auf Klassenebene für den kombinierten Primärschlüssel in einer Tabelle verwenden. beispielsweise:

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

öffentliche Klasse ProductAttribute {}


1

Eine eindeutige Anmerkung sollte direkt über der Attributdeklaration platziert werden. UniqueContlements gehen in die Annotation @Table über der Datenklassendeklaration. Siehe unten:

@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?,
)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.