Que signifient REFRESH et MERGE en termes de bases de données?

93

Je suis curieux et j'ai besoin de trouver cette réponse rapidement. Google n'aidera pas beaucoup.

L'API Java Persistence possède ces propriétés qui indiquent au framework de mettre en cascade les opérations sur les entités associées:

CascadeType.PERSIST
CascadeType.DELETE
CascadeType.MERGE
CascadeType.REFRESH

Je sais ce que signifient les deux premiers: lorsque je persiste l'objet A qui a B, persiste B également, et lorsque je supprime A, supprime B également.

Mais je ne peux pas comprendre ce que les deux autres accomplissent. Aidez-moi?

André Chalella
la source

Réponses:

79

REFRESH signifie "extraire tous les changements d'état de la base de données dans ma représentation". La mise en cascade est simple; cela signifie que toutes les entités associées sont actualisées.

MERGE signifie quelque chose de complexe qui se rapproche de "enregistrer" mais qui ressemble plus à "repousser cette entité détachée dans un état géré et enregistrer ses changements d'état"; la cascade signifie que toutes les entités associées sont repoussées de la même manière, et le handle d'entité gérée dont vous récupérez .merge()a toutes les entités gérées qui lui sont associées.

Lien vers une instance des documents pertinents

le chaos
la source
Quelle est la valeur par défaut (si nous n'avons défini aucun CascadeType), et quel est le plus raisonnable / le plus courant à définir?
Rosdi Kasim
@Rosdi Kasim: La valeur par CascadeTypedéfaut est un tableau vide.
user1438038
@chaos so refresh met à jour les enfants pour qu'ils correspondent à ce qui se trouve dans la base de données lorsque le parent est mis à jour / actualisé. La fusion écrasera essentiellement les champs mis à jour dans les enfants de la base de données pour refléter les entités enfants avec le parent. Donc, si les deux sont utilisés, que se passe-t-il? J'imagine que j'ai mal compris cela.
Jordan Mackie
87

Signification de l'annotation JPA pour les relations plusieurs à plusieurs :

  • ALL - toutes les opérations en cascade possibles effectuées sur l'entité source sont mises en cascade sur la cible de l'association.
  • FUSION - si l'entité source est fusionnée, la fusion est mise en cascade sur la cible de l'association.
  • PERSIST - si l'entité source est persistante, la persistance est mise en cascade sur la cible de l'association.
  • REFRESH - si l'entité source est actualisée, l'actualisation est mise en cascade sur la cible de l'association.
  • REMOVE - si l'entité source est supprimée, la cible de l'association est également supprimée.

Je les vois moi-même de cette façon (plus lisible):

  • MERGE - pour les objets existants, pour fusionner les données existantes dans la table avec les données de mon objet. (synchroniser avec la base de données)
  • PERSIST - crée de nouveaux enregistrements à partir d'un objet dans la base de données.
  • REFRESH - est de rafraîchir les données dans l'objet. Il y a peut-être eu un changement sur la base de données qui doit être synchronisé. (synchronisation depuis la base de données)
  • SUPPRIMER - c'est bien supprimer.
cgp
la source
1
Le Javadoc pour les annotations n'a rien clarifié pour moi. Merci d'avoir répondu!
André Chalella