Supposons que j'ai un objet Utilisateur mappé avec un user_id comme clé primaire et une colonne de courrier avec une contrainte unique. Je souhaite que mon programme enregistre un objet Utilisateur dans la table des utilisateurs uniquement s'il n'existe pas.Insertion d'un objet sur la base de données en mode hibernation, uniquement si elle n'existe pas
je peux faire la chose suivante dans ma fonction d'insertion:
- begin transaction
- requête pour un utilisateur avec le courrier donné
- si elle n'existe pas, créez un nouvel utilisateur et enregistrer à l'aide de la session
- validée ou annulée en cas d'échec
il y a deux problèmes:
- Il est coûteux d'effectuer deux requêtes. Si j'utilisais du SQL simple, je pourrais utiliser la syntaxe "INSERT IGNORE", mais dans mon cas, je veux utiliser la méthode de sauvegarde hibernate, et je veux aussi maintenir l'objet User à la fin. Y a-t-il une solution pour cela?
- Concurrence. Est-il possible que deux instances de mon application s'exécutent en même temps. Les deux utiliseront la fonction "addUser" avec le même paramètre "mail". Le premier passera par la phase 2 et ne trouvera pas un utilisateur avec ce courrier. Le second passera également par la phase 2 sans trouver d'utilisateur car la première instance n'a toujours pas sauvegardé son utilisateur et validé. Ensuite, la première instance enregistrera et validera l'utilisateur, et ensuite la seconde instance enregistrera et validera l'utilisateur, qui a le même courrier que le courrier de la première instance. Bien sûr, ça va échouer, à cause de la contrainte. Ai-je raté quelque chose?
Si je suis en ce que dois-je faire:
- espoir que cela ne se produira pas.
- Verrouillez la table des utilisateurs pour lecture et écriture au début de la transaction.
- Ajouter try ... sauf pour la fonction, à l'exception d'une exception de contrainte unique, et si l'exception est levée, sélectionnera simplement l'utilisateur de la base de données en fonction de son courrier.
- Autres solutions ...
Hm, je considère cela comme une mauvaise pratique. Les exceptions ne sont pas destinées à contrôler le flux. Voir "Java efficace" :-) – Fortega
@Fortega, je suis d'accord. Je préfère prendre le coup de performance et déterminer si l'utilisateur existe avant l'insertion. –