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

xyz
quelle
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):

mdma
quelle
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;
}
Divanshu
quelle
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.

FrancescoM
quelle
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)
GlenPeterson
quelle
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

Manjunath HM
quelle
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.

CodamRanjan
quelle
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 {}

Hasch yousefi
quelle
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?,
)
R Lu
quelle