Logica basata su campi modificati di un'entità di Hibernate

0

Ho un oggetto di entità Hibernate MyObject con diversi attributi e un servizio MyObjectService contenente la logica di business che si occupa di MyObject . Ho anche un modello di vista che riguarda l'input / output dell'utente che usa MyOjectService . Questo servizio contiene il metodo updateMyObject(MyObject o) che viene chiamato dal modello di visualizzazione quando l'utente modifica alcuni attributi e salva queste modifiche nel database.

Quando alcuni (non tutti) attributi di MyObject vengono aggiornati, devo notificare un sistema esterno. Sto cercando di capire il modo migliore per implementare questa funzionalità. Queste sono le soluzioni che ho trovato finora:

  1. Il metodo MyObjectService.update(MyObject o) otterrebbe un secondo parametro booleano che indica se inviare la notifica al sistema esterno. Questa è la soluzione più semplice, ma probabilmente non è consigliabile lasciare che il modello della vista (che chiama il metodo) decida se inviare la notifica o meno. Preferirei avere questa decisione nel servizio.

  2. Il modello di visualizzazione manterrebbe una copia dello stato originale dell'oggetto insieme allo stato modificato. Il metodo update avrebbe quindi 2 argomenti (prima e dopo) e verificherebbe se gli attributi da notificare sono cambiati. Ciò comporterebbe una condizione piuttosto brutta come if (before.attr1 != after.attr1 or before.attr2 != after.attr2 or ... ) contenente un numero elevato di attributi che possono crescere in futuro.

  3. Avere un metodo di aggiornamento separato in MyObjectService per ogni attributo di MyObject . In questo modo, ogni metodo deciderebbe se la notifica deve essere inviata o meno. Questo è probabilmente il modo più pulito, ma dovrei avere un gran numero di metodi di aggiornamento (1 per ogni attributo).

Quindi ognuna di queste soluzioni ha i suoi svantaggi. Quale useresti? O hai un'idea diversa su come farlo? C'è un modo in cui potrei usare Hibernate per aiutarmi con questo? (Ho cercato di scoprire se potevo usare Hibernate per scoprire quali attributi sono stati modificati, ma non ho trovato una soluzione soddisfacente).

    
posta Jardo 07.10.2014 - 16:14
fonte

1 risposta

1

Se ti capisco correttamente, hai due tipi di oggetti di stato:

  • Il @Entity che viene usato nel contesto di persistenza (Hibernate)
  • Il " viewmodel ", che si occupa dell'input dell'utente e come descrivi: »che utilizza MyOjectService«

Quindi il tuo flusso di dati proviene da utente a viewmodel e dal viewmodel all'entità - noi potrebbe trascurare la persistenza per il tuo problema.

In questo scenario c'è un terzo componente - il MyOjectService coinvolto e c'è un strong accoppiamento tra view-model e questo servizio.

Il mio suggerimento è: implementare un modello di osservatore .

Ogni volta, viewmodel viene modificato, gli osservatori ricevono una notifica:

1) Un osservatore è responsabile di chiamare MyOjectService su qualsiasi modifica del viewmodel

2) Un secondo osservatore / modello è responsabile della gestione dello stato per attivare la notifica. Può contenere solo tre booleani ( attributo1Set? , attributo2Set? , attributo 3 Set? ) e se tutti e tre sono stati impostati, viene emesso un evento aggiornare il servizio esterno. Successivamente, gli attributi vengono reimpostati.

Il flusso di lavoro sarà simile al seguente:

L'entità viene recuperata da db- > Viewmodel filled- > reset trigger- > Viewmodelchange porta a un aggiornamento nel database e, infine, a modifiche nel Triggerobject - > Triggerobject cambia stato e controlla, se è necessario aggiornare i sistemi esterni o non- > Trigger attivato = Reset trigger

Ottieni il punto;)

Quindi hai chiare responsabilità:

1) @Entity è solo per la persistenza

2) Viewmodel è solo per l'interazione dell'utente

3) Il "Trigger" serve solo ad attivare il servizio esterno

Il modello di osservatore ti aiuta a disaccoppiare e separare queste responsabilità.

    
risposta data 08.10.2014 - 10:26
fonte

Leggi altre domande sui tag