Comment est-Hibernate afin de décider de la mise à jour/insérer/supprimer
Nous allons tout d'abord oublier la mise en veille prolongée. Supposons que j'ai deux tables, Une & B. Deux opérations sont la mise à jour de documents mêmes dans ces deux tableaux, mais txn 1 mise à jour de B, puis A, tandis que txn 2 mise à jour A puis B. C'est un typique exemple de blocage. La plus commune façon d'éviter cela est en pré-définition de l'ordre d'acquisition des ressources. Par exemple, nous devrions mettre à jour le tableau A puis B.
Revenir à Hibernate. Lorsque nous mettons à jour beaucoup d'entités en une seule session, une fois que je suis rinçage de la session, les modifications des différentes entités va générer correspondant insert/update/delete DB. Ne Hibernate ont un algorithme pour décider de l'ordre du jour parmi les entités? Si non, quel est le moyen de Hibernate utilisé pour empêcher le blocage de la situation décrite dans le 1er paragraphe?
Si Hibernate est le maintien de l'ordre, comment puis-je savoir ou de contrôler l'ordre? Je ne veux pas que mon explicite de mise à jour en DB conflits avec mise en veille prolongée, et provoquer un blocage.
Vous devez vous connecter pour publier un commentaire.
Le problème que vous décrivez n'est pas traitée par la base de données, et de mon expérience, n'est pas entièrement prise en charge par Hibernate soit.
Vous avez à prendre des mesures explicites pour éviter qu'elle ne soit un problème.
Hibernate ne fait partie du travail pour vous. Comme pour la précédente réponse, Hibernate assure que, dans un cas isolé rincer les insertions, suppressions et mises à jour sont commandés de manière à s'assurer qu'ils seront appliqués dans réalisable commande. Voir performExecutions(EventSource session) dans le AbstractFlushingEventListener classe:
Quand avoir des contraintes uniques, il est très important de connaître cet ordre, surtout si vous souhaitez remplacer un un-à-plusieurs enfant (supprimer les anciens/insérer un nouveau), mais à la fois l'ancien et le nouveau et l'enfant partagent la même et unique contraintes (par exemple, même adresse email). Dans ce cas, vous pourriez mettre à jour l'ancienne entrée, au lieu de la suppression/insertion, ou vous pouvez rincer après seulement supprimer pour ensuite continuer l'insertion. Pour un exemple plus détaillé, vous pouvez vérifier cet article.
Remarque qu'il ne précise pas l'ordre des mises à jour. En examinant le code Hibernate m'amène à penser que la mise à jour de l'ordre dépend de l'ordre dans lequel les entités ont été ajoutées au contexte de persistance, PAS l'ordre où ils ont été mis à jour. Qui pourrait être prévisible dans votre code, mais la lecture du code Hibernate ne m'ont pas laissé un sentiment, je voudrais invoquer cette commande.
Il y a trois solutions que je peux penser de:
Concernant le premier exemple de ce genre de choses est géré par la base de données (pour en savoir plus sur les niveaux d'isolation des transactions et stratégies de verrouillage de votre base de données). Il existe de nombreuses façons cela peut être manipulé.
À Hibernate, javadoc pour org.mise en veille prolongée.de l'événement.def.AbstractFlushingEventListener.performExecutions(EventSource) dit:
Exécuter toutes les SQL et cache de second niveau, mises à jour, une commande spéciale, de sorte que les contraintes de clé étrangère ne peut pas être violé:
Je suppose que c'est la seule optimisation d'exécution des requêtes SQL, Hibernate fait. Le reste des problèmes est géré par la base de données.