Ho un componente che deve aggiornare il database per il cliente e l'indirizzo del cliente (tramite JDBC). È opportuno chiamare il CustomerAddressDAO dal CustomerDAO? Oppure creare un componente "CustomerDataManager" separato che li chiama separatamente?Un DAO può chiamare DAO?
risposta
È possibile farlo, ma ciò non significa che si dovrebbe. In questi casi, mi piace utilizzare un servizio (CustomerService
in questo caso) con una chiamata al metodo che utilizza entrambi DAO. È possibile definire la transazione attorno al metodo di servizio, quindi se una chiamata fallisce, entrambe eseguono il rollback.
Il problema con i DAO che chiamano altri DAO si risolvono abbastanza rapidamente con riferimenti circolari. L'iniezione di dipendenza diventa molto più difficile.
È possibile chiamare un DAO da un altro ma considerare anche la creazione di CustomerAddressDAO in CustomerDAO (dopo tutto si tratta di cliente e non penso che si desideri avere l'indirizzo del cliente senza il cliente).
Ovviamente, puoi farlo in diversi modi. Ma, per rispondere correttamente a questa domanda, dovresti iniziare dal tuo modello. Nel modello, vedere se Indirizzo è un'entità (qualcosa con un proprio ID e utilizzato anche in modo indipendente) oppure è un tipo di valore (qualcosa che ha senso solo nel contesto di un cliente. Quindi, si avranno due casi:
Indirizzo è un'entità: In questo caso, indirizzo ha il suo Dao e il Cliente ha la propria Dao Né Dao deve accedere l'altra Se c'è una logica che ha bisogno di manipolare i due, allora.. deve essere nella vostra logica dell'applicazione, non in Data Access layer
indirizzo è un tipo di valore associato con il Cliente:. in questo caso, l'indirizzo non ha un DAO separata di Itse lf. Viene salvato/ripristinato come parte dell'oggetto contenente il cliente.
Conclusione: Se correttamente progettati, i DAO non si accedono l'un l'altro (in situazioni standard).
"Se c'è qualche logica che deve manipolare i due, allora ciò deve essere nella logica dell'applicazione, non in Data Access Layer." - E se dovesse essere transazionale? (Ad esempio, devo assicurarmi che sia il Cliente sia l'Indirizzo siano stati cancellati) – HEATH3N
Questa è una buona domanda! Penso che, in questo scenario, abbia senso avere l'indirizzo come tipo di valore associato al cliente. Ciò consente di manipolare l'indirizzo insieme al cliente, ad es. cancellazione dei due. –
Cosa ti impedisce di farlo nel livello aziendale? – Andre