Sto usando JPA / Hibernate ma probabilmente non limita la domanda.
Attualmente sto scrivendo il mio codice di accesso ai dati nelle mie classi di controller web. Grazie a JPA, nella maggior parte dei casi questo codice è molto semplice, in pratica semplice query con configurazione banale.
Ho provato a spostare questi metodi in classi separate per migliorare il riutilizzo del codice. Ma ho riscontrato un problema importante. Sebbene esistano metodi simili, non sono uguali. Questo vale in particolare per il recupero delle classi unite (tabelle). In alcuni controller non ho bisogno di andare a prendere quelle lezioni. Ma in alcuni controller ho bisogno di questo. Quindi ho le seguenti varianti:
-
Sposta tutti i metodi, anche leggermente diversi, come metodi separati nella classe DAO. Questo rende DAO complesso, i loro nomi di metodo saranno molto lunghi, sarebbe difficile trovarne uno corretto.
-
Dimentica i join di recupero. Applicazione di installazione per eseguire il caricamento quando necessario (caricamento lento). Ciò ridurrà il numero di metodi, ma l'accesso al database sarà molto meno efficace e la transazione deve estendersi su tutta la richiesta, non solo sul codice del controller.
-
Inserisci la logica complessa nel metodo quando necessario. Per esempio. fornire parametri booleani
fetchSomething
. E il metodo ottimizzerà la query in base a quei parametri. L'implementazione del metodo sarà molto complessa dato che dovrei creare una stringa di query da pezzi o utilizzare un'API di criteri molto ingombrante. Il metodo sarà difficile da leggere e capire. -
Invia così com'è. In genere mi piace questo approccio. Porta ad alcune duplicazioni di codice, ma non molto e le query sono dichiarative quindi non vedo molti problemi con questo. Il problema principale è la mancanza di testabilità. Per testare il controller avrei bisogno di preparare un database, perché non c'è (o non ho trovato) un'implementazione di simulazione JPA complessa con dati in memoria forniti.
Mi chiedo quale approccio viene utilizzato in progetti complessi? Ho visto il 4 ° approccio e ho visto un ORM interno molto complesso basato su Hibernate.
Sto parlando ora del cosiddetto "modello di repository". Non capisco veramente cosa significhi la gente per "livello di servizio" e non ho mai visto alcuna necessità con questo, quindi attualmente la domanda riguarda le classi di repository di dati.