Comment faire pour imiter upsert comportement de l'utilisation d'Hibernate?
Je suis en train d'écrire une application qui sync entités à partir d'un tiers de la source de données dans notre propre schéma, avec une transformation/cartographie de l'étape entre les deux. Je suis de l'utilisation d'Hibernate pour représenter et de persister les entités dans notre propre schéma. Un problème que je suis en cours d'exécution en est que j'ai un unique multi-colonne de clé sur l'un de mes tables. Le comportement que je voudrais voir est analogue à un upsert: quand Hibernate va persister une entité et détecte une violation de contrainte d'unicité, il ne fait pas de mise à jour à la place. Nous utilisons MySQL, qui fournit un INSERT ... SUR un DOUBLE de la CLÉ de mise à JOUR de la syntaxe, mais je ne suis pas sûr de savoir comment ou si Hibernate peut être fait pour rendre l'utilisation de celui-ci?
Je suppose que je pourrais toujours essayer de l'insérer, et si j'attrape une exception faire une mise à jour, mais qui semble hacky et sous-optimale. Des conseils sur la façon propre de faire cela?
OriginalL'auteur Jason | 2010-09-08
Vous devez vous connecter pour publier un commentaire.
Il ressemble à quelqu'un il n' en remplaçant la
sql-insert
instruction utilisée par Hibernate pour cette entité. Si vous n'avez pas l'esprit de ne pas être portable (et probablement à l'aide d'une procédure stockée), ont un coup d'oeil.Une autre option serait de:
Mais à moins que vous verrouillez la ensemble table(s) pendant le processus, vous pouvez faire face à certaines condition de concurrence dans un environnement multi-thread et distribué de l'environnement et de l'étape 3 peut éventuellement échouer. Imaginez deux threads simultanés:
Thread 1:
Filetage 2:
De sorte que vous auriez à mettre en œuvre une sorte de mécanisme de nouvelle tentative de toute façon (le verrouillage de l'ensemble de la table(s) n'est pas une bonne option de l'OMI).
OriginalL'auteur Pascal Thivent
La condition de la course peut être évité par "select ... for update"
OriginalL'auteur Ken Jarrad