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:
-
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. -
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 comeif (before.attr1 != after.attr1 or before.attr2 != after.attr2 or ... )
contenente un numero elevato di attributi che possono crescere in futuro. -
Avere un metodo di aggiornamento separato in
MyObjectService
per ogni attributo diMyObject
. 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).