Annotation @UniqueConstraint en Java


169

J'ai un bean Java. Maintenant, je veux être sûr que le champ doit être unique.

J'utilise le code suivant:

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

Mais j'obtiens une erreur:

@UniqueConstraint is dissallowed for this location

Quelle est la bonne façon d'utiliser des contraintes uniques?

Remarque: j'utilise le framework de jeu.


15
"Mais j'obtiens une erreur." Spécifiez toujours l' erreur que vous obtenez dans la question. Vous disposez d'informations pertinentes qui peuvent très bien nous aider à résoudre votre problème - ne les gardez pas pour vous.
Jon Skeet

Serait-il possible d'utiliser l'annotation @id?
Albinoswordfish

Réponses:


415

Pour vous assurer qu'une valeur de champ est unique, vous pouvez écrire

@Column(unique=true)
String username;

L'annotation @UniqueConstraint sert à annoter plusieurs clés uniques au niveau de la table, c'est pourquoi vous obtenez une erreur lors de son application à un champ.

Références (JPA TopLink):


17
Il est important de noter que cela ne fonctionnera que si vous laissez JPA créer vos tables
naoru

118

Vous pouvez utiliser au niveau de la classe avec la syntaxe suivante

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

42

J'utilise actuellement le framework de jeu avec hibernate et annotation JPA 2.0 et ce modèle fonctionne sans problème

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

}

J'espère que cela a aidé.


20

Remarque: Dans Kotlin, la syntaxe pour déclarer les tableaux dans les annotations utilise arrayOf(...)au lieu de{...}

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

Remarque: à partir de Kotlin 1.2, il est possible d'utiliser la [...]syntaxe afin que le code devienne beaucoup plus simple

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

13

Way1:

@Entity

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

- Ici, Colonne1 et Colonne2 agissent séparément comme des contraintes uniques. Ex: si à tout moment la valeur de colonne1 ou colonne2 correspond, vous obtiendrez une erreur UNIQUE_CONSTRAINT.

Way2:

@Entity

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

- Ici, les valeurs combinées colonne1 et colonne2 agissent comme des contraintes uniques


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

   }

Contraintes uniques utilisées uniquement pour créer une clé composite, qui sera unique et représentera la table comme clé primaire combinée comme unique.


3

vous pouvez utiliser @UniqueConstraint au niveau de la classe, pour la clé primaire combinée dans une table. par exemple:

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

classe publique ProductAttribute {}


1

L'annotation unique doit être placée juste au-dessus de la déclaration d'attribut. UniqueContraints va dans l'annotation @Table au-dessus de la déclaration de classe de données. Voir ci-dessous:

@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?,
)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.