web-dev-qa-db-fra.com

Utilisation d'une contrainte unique sur Hibernate JPA2

Comment puis-je implémenter mes contraintes uniques sur les POJO d'hibernation? en supposant que la base de données n'en contient pas.

J'ai vu l'attribut unique dans l'annotation @Column() mais je n'ai pas pu le faire fonctionner?
Et si je veux appliquer cette contrainte à plusieurs colonnes?

24
Feras Odeh

Fondamentalement, vous ne pouvez pas implémenter de contrainte unique sans prise en charge de base de données.

@UniqueConstraint et unique attribut de @Column sont des instructions pour que l'outil de génération de schéma génère les contraintes correspondantes, ils n'implémentent pas les contraintes lui-même.

Vous pouvez effectuer une sorte de vérification manuelle avant d'insérer de nouvelles entités, mais dans ce cas, vous devez être conscient des problèmes possibles avec les transactions simultanées.

Par conséquent, l'application de contraintes dans la base de données est le choix préféré.

33
axtavt

Vous pouvez déclarer des contraintes uniques à l'aide de l'annotation @Table(uniqueConstraints = ...) dans votre classe

@Entity
@Table(uniqueConstraints=
           @UniqueConstraint(columnNames = {"surname", "name"})) 
public class SomeEntity {
    ...
}
45
Hons

Dans JPA2, vous pouvez ajouter la contrainte Unique directement au champ:

@Entity
@Table(name="PERSON_TABLE") 
public class Person{
  @Id
  @Column(name = "UUID")
  private String id;

  @Column(name = "SOCIALSECURITY", unique=true)
  private String socialSecurityNumber;

  @Column(name = "LOGINID", unique=true)
  private String loginId;
}

À mon humble avis, il vaut beaucoup mieux attribuer la contrainte unique directement aux attributs qu'au début de la table.

Si vous devez cependant déclarer une clé unique composite, la déclarer dans le @table l'annotation est votre seule option.

19
will824