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.