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.

xyz
la source
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):

mdma
la source
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;
}
Divanshu
la source
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é.

FrancescoM
la source
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)
GlenPeterson
la source
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

Manjunath HM
la source
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.

CodamRanjan
la source
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 {}

hashem yousefi
la source
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?,
)
R Lu
la source