ORM e DAO sono concetti ortogonali. Uno ha a che fare con il modo in cui gli oggetti sono mappati alle tabelle del database, l'altro è un modello di progettazione per scrivere oggetti che accedono ai dati. Non scegli "tra" loro. È possibile avere ORM e DAO è la stessa applicazione, proprio come non è necessario ORM per utilizzare il modello DAO.
Detto questo, mentre non si è mai realmente nello stato , è necessario utilizzare DAO. Il modello si presta a codice modulare. Mantieni tutte le tue logiche di persistenza in un unico posto (separazione delle preoccupazioni, lotta contro le astrazioni che perdono). Ti permetti di testare l'accesso ai dati separatamente dal resto dell'applicazione. E ti permetti di testare il resto dell'applicazione isolata dall'accesso ai dati (ad esempio puoi prendere in giro i tuoi DAO).
Inoltre, seguire il modello DAO è facile, anche se l'implementazione dell'accesso ai dati può essere difficile. Quindi ti costa pochissimo (o niente) e guadagni molto.
EDIT - Rispetto all'esempio, il metodo di accesso deve essere in una sorta di AuthenticationService. È possibile gestire le eccezioni lì (nel metodo di accesso). Se hai usato Spring, potrebbe gestire un sacco di cose per te: (1) transazioni, (2) iniezione di dipendenza. Non è necessario scrivere le proprie transazioni o fabbriche dao, è sufficiente definire i limiti delle transazioni attorno ai metodi di servizio e definire le implementazioni DAO come bean e quindi collegarle al servizio.
EDIT2
Il motivo principale per utilizzare il modello è di separare le preoccupazioni. Ciò significa che tutto il tuo codice di persistenza è in un posto. Un effetto collaterale di questo è, test-abilità e manutenibilità, e il fatto che questo rende più facile cambiare le implementazioni in seguito. Se stai creando DAO basati su Hibernate, puoi assolutamente manipolare la sessione nel DAO, questo è ciò che dovresti fare. Il pattern anti è quando il codice relativo alla persistenza si verifica al di fuori dello strato di persistenza (legge delle astrazioni che perdono).
Le transazioni sono un po 'più complicate. A prima vista, le transazioni potrebbero sembrare una preoccupazione di persistenza, e lo sono. Ma non sono solo una preoccupazione di persistenza. Le transazioni sono anche una preoccupazione dei tuoi servizi, in quanto i tuoi metodi di servizio dovrebbero definire una "unità di lavoro", il che significa che tutto ciò che accade in un metodo di servizio dovrebbe essere atomico. Se si utilizzano le transazioni di ibernazione, sarà necessario scrivere il codice di transazione in ibernazione al di fuori dei DAO, per definire i limiti delle transazioni intorno ai servizi che utilizzano molti metodi DAO.
Tuttavia, si noti che le transazioni possono essere indipendenti dall'implementazione: sono necessarie delle transazioni indipendentemente dal fatto che si utilizzi o meno l'ibernazione. Si noti inoltre che non è necessario utilizzare il meccanismo di transazione in ibernazione - è possibile utilizzare transazioni basate su container, transazioni JTA, ecc.
Non c'è dubbio che se non si utilizza Spring o qualcosa di simile, le transazioni stanno per essere un dolore Consiglio vivamente di utilizzare Spring per gestire le transazioni o la specifica EJB in cui I crede che sia possibile definire le transazioni intorno ai servizi con annotazioni.
Controlla i seguenti collegamenti per le transazioni basate su container.
Container-Managed Transactions
Sessions And Transactions
Quello che sto raccogliendo da questo è che si può facilmente definire le transazioni al di fuori dei DAO al livello di servizio, e non è necessario scrivere alcun codice di transazione.
Un'altra alternativa (meno elegante) consiste nel mettere tutte le unità atomiche di lavoro all'interno di DAO. È possibile avere DAO CRUD per le operazioni semplici e quindi DAO più complicati che eseguono più operazioni CRUD. In questo modo, le tue transazioni programmatiche rimangono nel DAO ei tuoi servizi chiamerebbero i DAO più complicati e non dovrebbero preoccuparsi delle transazioni.
Il seguente link è un buon esempio di come il modello DAO consente di semplificare il codice
AO vs ORM(hibernate) pattern
(thanx @daff)
Notate come la definizione dell'interfaccia fa sì che la tua logica di business si preoccupa solo del comportamento di UserDao. Non si preoccupa dell'attuazione. È possibile scrivere un DAO utilizzando la sospensione o semplicemente JDBC. In questo modo è possibile modificare l'implementazione dell'accesso ai dati senza influire sul resto del programma.
possibile duplicato di [Ho trovato JPA, o simili, non incoraggiare pattern DAO] (http://stackoverflow.com/questions/2100115/i-found-jpa-or-alike-dont-encourage-dao- modello) – Bozho
Forse verifica il mio post sul blog su quello. Propongo come combinare JPA con pattern DAO come diretto e DRY il più possibile: http://codeblock.engio.net/?p=180 – bennidi