39 votes

Contrainte unique avec JPA et Bean Validation

J’aimerais avoir une contrainte avec La validation des haricots, mais ce n’est pas prévu par la norme. Si je voudrais utiliser JPA, je n’aurais pas un mécanisme unique de validation et de rapport d’erreur.

Existe-t-il un moyen de définir comme une contrainte de validation des haricots et de la `` combiner avec JPA, de sorte que JPA crée une colonne avec une contrainte unique et vérifie wheter une valeur est unique ou non?

54voto

Pascal Thivent Points 295221

À moins que vous acquérir un verrou sur une table entière, c'est fondamentalement pas possible de vérifier l'unicité à l'aide d'une requête SQL (toute transaction simultanée pourrait modifier les données après une vérification manuelle mais avant la validation de la poursuite de la transaction). En d'autres termes, il n'est pas possible de mettre en œuvre un unique valide vérification à la Java niveau et donc de fournir une validation de la mise en œuvre. Le seul moyen fiable de vérifier l'unicité est alors que la validation de la transaction.

Le BV spec résume comme ceci:

Annexe D. Persistance Java 2.0 intégration

Question: doit-on ajouter @Unique qui serait carte à @Column(unique=true)?

@Unique ne peut pas être testée à la Java niveau de manière fiable, mais pourrait générer un base de données unique contrainte de génération. @Unique n'est pas une partie de la BV spec aujourd'hui.

Ainsi, alors que je suis d'accord qu'il serait agréable d'avoir unique (et non nul), les violations de contrainte enveloppé dans un Bean Validation exception, ce n'est pas le cas actuellement.

Références

5voto

Hardy Points 6274

Plus d’informations sur la façon de mettre en œuvre un @Unique et le problème autour de lui peuvent être trouvés ici - http://community.jboss.org/wiki/AccessingtheHibernateSessionwithinaConstraintValidator

3voto

Mateusz Dymczyk Points 4489

Eh bien, vous pouvez le faire, mais ce n’est pas trivial. Le problème est que ce validateur nécessite l’accès à la base de données pour effectuer certaines requêtes contre elle pour vérifier si la valeur que vous souhaitez insérer est déjà là ou non et cela ne peut pas être vraiment fait à partir du validateur car il n’a pas accès à la sessionFactory / session. Bien sûr, vous pouvez l’instanter (session/sessionFactory) à l’intérieur du validateur, mais ce n’est pas une bonne pratique de codage.

2voto

dukethrash Points 100

Vous pouvez faire un validateur de lire les annotations JPA et de l'appliquer. Ici est un peu un exemple d'utilisation de printemps validateurs qui peut être utilisé comme une idée à développer.

JPA JSR303 Printemps de Validation de Formulaire

Vous pouvez également injecter (@Inject ou au Printemps de l' @Autowired) votre session bean dans un validateur personnalisé et le conteneur doit savoir comment le fil jusqu'. Je sais seulement ce qu'un Ressort par exemple:

import javax.validation.ConstraintValidator;

public class MyConstraintValidator implements ConstraintValidator {

@Autowired //@Inject
private Foo aDependency;

...
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X