La mia domanda è questa: C'è mai un ruolo per JPA merge
in un'applicazione Web stateless?JPA si fonde in un'applicazione web RESTful con DTO e blocco ottimistico?
C'è un sacco di discussioni su SO sul funzionamento merge
in JPA. C'è anche un great article on the subject che contrappone l'unione JPA tramite un processo Do-It-Yourself più manuale (dove trovi l'entità tramite il gestore di entità e apporti le modifiche).
La mia applicazione dispone di un modello di dominio ricco (ala-driven design) che utilizza l'annotazione @Version
per utilizzare il blocco ottimistico. Abbiamo anche creato DTO per l'invio su cavo come parte dei nostri servizi web RESTful. La creazione di questo livello DTO ci consente anche di inviare al client tutto ciò di cui ha bisogno e nulla lo fa.
Finora, ho capito che questa è un'architettura abbastanza tipica. La mia domanda riguarda i metodi di servizio che necessitano di AGGIORNARE gli oggetti esistenti (ad es. HTTP PUT). In questo caso abbiamo questi due approcci 1) JPA Merge e 2) DIY.
Quello che non capisco è come l'unione JPA possa essere considerata un'opzione per la gestione degli aggiornamenti. Ecco il mio pensiero e mi chiedo se c'è qualcosa che non capisco:
1) Per creare correttamente un'entità JPA separata da un DTO filo, il numero di versione deve essere impostato correttamente ... else un OptimisticLockException viene lanciato Ma la specifica JPA dice:
Un'entità può accedere allo stato del suo campo versione o proprietà o esportare un metodo per l'utilizzo con l'applicazione per accedere alla versione, ma non deve modificare il valore di versione [30] . Solo il provider di persistenza è autorizzato a impostare o aggiornare il valore dell'attributo di versione nell'oggetto .
2) Unisci non gestisce le relazioni bidirezionali ... i campi di puntamento all'indietro sempre finiscono come null.
3) Se dal DTO mancano campi o dati (a causa di un aggiornamento parziale), l'unione JPA eliminerà tali relazioni o cancellerà tali campi. Hibernate può gestire gli aggiornamenti parziali, ma non l'unione JPA. Fai da te in grado di gestire gli aggiornamenti parziali.
4) La prima cosa che farà il metodo di unione è interrogare il database per l'ID entità, quindi non ci sono benefici sulle prestazioni rispetto a DIY.
5) In un aggiornamento DYI, si carica il soggetto e apportare le modifiche secondo la DTO - non ci sono chiamate a merge
o persist
per questo perché il contesto dell'APP implementa il modello di unità di lavoro fuori della scatola.
Ho diritto?
Edit:
6) Unire il comportamento per quanto riguarda le relazioni caricati pigri possono differ amongst providers.