vérifie la violation de contrainte avant de la persistance d'une entité
Quel est le meilleur mécanisme pour la prévention de la violation de la contrainte de vérifications avant la création | modification d'une entité?
Suppose que si l '"Utilisateur" entité a "identifiant de connexion" comme l'unique contrainte, serait-il sage de vérifier s'il existe une entrée d'utilisateur déjà avec cette loginid nom de la création ou de la modification.
OU
Laisser la base de données de jeter un ConstraintViolationException et gérer ce message de façon appropriée dans la couche d'INTERFACE utilisateur. Où de telles vérifications être appliquées dans le framework jboss seam.
Remarque: Actuellement, aucun de ces contrôles sont appliquées sur le seam-gen de code.
Nous utilisons actuellement Seam 2.2, Richfaces avec Hibernate.
OriginalL'auteur Joe | 2010-01-30
Vous devez vous connecter pour publier un commentaire.
Même si vous vérifiez l'état de votre code avant de la persistance de l'utilisateur de l'objet il y a toujours un risque que quelqu'un créé un double de l'identifiant de connexion entre le moment où vous vérifiez et quand vous persistez, le nouvel Utilisateur.
Cependant, il sera plus facile pour afficher un message d'erreur approprié dans l'INTERFACE utilisateur si vous faites une vérification explicite. Si vous avez plusieurs contraintes sur la table de la capture de la ConstraintViolationException ne vous permettra pas de déterminer facilement la contrainte a été violé.
Donc je ferais les deux. En supposant que vous êtes s'étendant à partir de la Couture du EntityHome:
MODIFIER
Comme Shervin mentionné la création d'un JSF Validator est une bonne idée (de remplacement) #1 ci-dessus, mais vous devriez toujours s'attendre au pire et attraper ConstraintViolationException.
Le client autonome toujours faire un direct JPA appel, ou peut-on le forcer à passer par un DAO?
Nous sommes à l'aide de composants Seam (EntityHome, EntityQuery interfaces) qui servent actuellement de la colle entre l'interface utilisateur et la couche de persistance JPA. Il n'est pas clair pour moi, si je pouvais appliquer les clients autonomes à l'utilisation de la Couture de la couche d'abstraction pour la persistance, au lieu de la couche JPA directement. Si la Couture de la couche doit être présente, Couture bibliothèques doit être fourni dans le cadre de la client toolkit. Pas sûr de ce qui est la meilleure approche ici
Qui peuvent causer assez bien des requêtes supplémentaires, ce qui aura un impact sur les performances de mal.
OriginalL'auteur mtpettyp
Je suis en désaccord avec la gestion de la ConstraintException. J'ai écrit un validateur qui vérifie les doublons avant de l'enregistrer, et il fonctionne très bien.
Voici un exemple de vérification des e-mails en double.
Et dans votre formulaire (xhtml) vous écrivez:
De cette façon, il sera toujours valider la zone avant de l'enregistrer. Vous pouvez même mettre un:support de balise pour valider lorsque le focus est changé.
Il ya encore une chance que votre base de données peut être mise à jour avec un double de l'e-mail, entre le "Processus de Validations" et "mettre à Jour le Modèle" JSF phases et une ConstraintException serait jeté.
Pas de chances que cela arrive si vous utilisez le verrouillage Optimiste, c'est à dire
@Version
OriginalL'auteur Shervin Asgari
Mon conseil est que si vous pouvez vérifier une condition de vérifier ensuite il c'est à dire dans votre cas UserExists appel de méthode. De lever des exceptions est cher et est prévu pour des cas exceptionnels, normalement liées à des choses hors de votre contrôle, par exemple, accès au disque etc
Vous aurait généralement effectuer cette vérification dans une logique d'entreprise avant d'appeler l'entité qui doit être ajouté à la base de données.
La question est: ce qui est plus cher, les essais sur CHAQUE writeoperation de la bd ou de la gestion d'une exception que lorsque quelque chose va mal?
OriginalL'auteur David