Cosa significano REFRESH e MERGE in termini di database?


94

Sono curioso e ho bisogno di trovare rapidamente questa risposta. Google non aiuterà molto.

L'API Java Persistence ha queste proprietà che indicano al framework di eseguire operazioni a cascata sulle entità associate:

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

So cosa significano i primi due: quando persisto l'oggetto A che ha B, persisto anche B e quando elimino A, elimino anche B.

Ma non riesco a dare un senso a ciò che fanno gli altri due. Aiuto?

Risposte:


80

REFRESH significa "trasferire qualsiasi cambiamento di stato dal database nella mia rappresentazione". Il collegamento a cascata è semplice; significa che tutte le entità associate vengono aggiornate.

MERGE significa qualcosa di complesso che si avvicina a "salva" ma è più simile a "spingere questa entità scollegata indietro nello stato gestito e salvare i suoi cambiamenti di stato"; la cascata significa che tutte le entità associate vengono respinte allo stesso modo e l'handle dell'entità gestita da cui si ritorna .merge()ha tutte le entità gestite associate.

Collegamento a un'istanza dei documenti pertinenti


1
Qual è il valore predefinito (se non abbiamo impostato alcun CascadeType) e qual è il più sensato / comune da impostare?
Rosdi Kasim

@Rosdi Kasim: il CascadeTypevalore predefinito è un array vuoto.
user1438038

@chaos so refresh aggiorna i figli in modo che corrispondano a ciò che è nel database quando il genitore viene aggiornato / rinfrescato. L'unione essenzialmente sovrascriverà i campi aggiornati nei figli nel database per riflettere le entità figlio con il genitore. Quindi se vengono utilizzati entrambi, cosa succede? Immagino di aver capito male questo.
Jordan Mackie

87

Significato dell'annotazione JPA per relazioni molti a molti :

  • ALL: tutte le possibili operazioni a cascata eseguite sull'entità di origine vengono applicate a cascata alla destinazione dell'associazione.
  • MERGE: se l'entità di origine viene unita, l'unione viene eseguita in cascata alla destinazione dell'associazione.
  • PERSIST: se l'entità di origine è persistente, la persistenza viene applicata in cascata alla destinazione dell'associazione.
  • REFRESH: se l'entità di origine viene aggiornata, l'aggiornamento viene eseguito in cascata alla destinazione dell'associazione.
  • RIMUOVI: se l'entità di origine viene rimossa, viene rimossa anche la destinazione dell'associazione.

Io stesso li vedo in questo modo (più leggibile):

  • UNISCI - per gli oggetti esistenti, per unire i dati esistenti nella tabella con i dati nel mio oggetto. (sincronizza con database)
  • PERSIST - crea nuovi record da un oggetto nel database.
  • REFRESH - serve per aggiornare i dati nell'oggetto. Forse c'è stata una modifica sul database che deve essere sincronizzata. (sincronizzazione dal database)
  • RIMUOVI - è, beh, elimina.

1
Il Javadoc per le annotazioni non mi ha chiarito nulla. Grazie per la risposta!
André Chalella
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.