ORM und DAO sind orthogonale Konzepte. Einer hat damit zu tun, wie Objekte zu Datenbanktabellen zugeordnet werden, der andere ist ein Entwurfsmuster zum Schreiben von Objekten, die auf Daten zugreifen. Du wählst nicht zwischen ihnen. Sie können ORM und DAO die gleiche Anwendung haben, genauso wie Sie kein ORM benötigen, um das DAO-Muster zu verwenden.
Das sagte, während Sie nie wirklich brauchen nichts, sollten Sie DAOs verwenden. Das Muster eignet sich für einen modularisierten Code. Du behälst all deine Beharrungslogik an einem Ort (Trennung von Bedenken, Bekämpfung undichter Abstraktionen). Sie erlauben sich, den Datenzugriff getrennt vom Rest der Anwendung zu testen. Und Sie erlauben sich, den Rest der Anwendung zu testen, die vom Datenzugriff isoliert ist (d. H. Sie können Ihre DAOs verspotten).
Außerdem ist das Folgen des DAO-Musters einfach, selbst wenn die Implementierung des Datenzugriffs schwierig sein kann. So kostet es Sie sehr wenig (oder nichts) und Sie gewinnen viel.
BEARBEITEN - In Bezug auf Ihr Beispiel sollte Ihre Login-Methode in einer Art von AuthenticationService sein. Dort können Sie Ausnahmen behandeln (in der Login-Methode). Wenn Sie Spring verwenden, könnte es eine Menge Dinge für Sie verwalten: (1) Transaktionen, (2) Abhängigkeitsinjektion. Sie müssten nicht Ihre eigenen Transaktionen oder Dao-Factories schreiben, Sie könnten einfach Transaktionsgrenzen für Ihre Servicemethoden definieren und Ihre DAO-Implementierungen als Beans definieren und sie dann in Ihren Service einbinden.
EDIT2
Der Hauptgrund um das Muster zu verwenden ist Anliegen zu trennen. Das bedeutet, dass sich der gesamte Persistenz-Code an einem Ort befindet. Ein Nebeneffekt davon ist die Testfähigkeit und Wartbarkeit und die Tatsache, dass dies später den Umstieg erleichtert. Wenn Sie Hibernate-basierte DAOs erstellen, können Sie die Sitzung im DAO absolut manipulieren, was Sie tun sollten. Das Anti-Muster ist der Fall, wenn Persistenzcode außerhalb der Persistenzschicht auftritt (Gesetz der undichten Abstraktionen).
Transaktionen sind ein bisschen komplizierter. Auf den ersten Blick scheinen Transaktionen ein Problem der Beharrlichkeit zu sein, und sie sind es auch. Aber sie sind nicht nur eine Frage der Beharrlichkeit. Transaktionen sind auch ein Anliegen Ihrer Dienste, da Ihre Dienstmethoden eine "Arbeitseinheit" definieren sollten, was bedeutet, dass alles, was in einer Dienstmethode geschieht, atomar sein sollte. Wenn Sie Transaktionen im Ruhezustand verwenden, müssen Sie den Transaktionscode für den Ruhezustand außerhalb Ihrer DAOs schreiben, um Transaktionsgrenzen für Dienste zu definieren, die viele DAO-Methoden verwenden.
Beachten Sie jedoch, dass die Transaktionen unabhängig von Ihrer Implementierung sein können - Sie benötigen Transaktionen, unabhängig davon, ob Sie Hibernate verwenden oder nicht. Beachten Sie auch, dass Sie die Hibernate-Transaktionsmaschinerie nicht verwenden müssen - Sie können containerbasierte Transaktionen, JTA-Transaktionen usw. verwenden.
Kein Zweifel, wenn Sie Spring oder etwas ähnliches nicht verwenden, werden Transaktionen ausgeführt sei ein Schmerz. Ich empfehle Ihnen, Spring zu verwenden, um Ihre Transaktionen zu verwalten, oder die EJB-Spezifikation, in der Sie glauben, Sie können Transaktionen um Ihre Dienste mit Anmerkungen definieren.
Überprüfen Sie die folgenden Links für Container-basierte Transaktionen.
Container-Managed Transactions
Sessions And Transactions
Was aus dieser Ich sammle ist, dass man leicht die Transaktionen außerhalb der DAOs auf der Service-Ebene definieren, und Sie brauchen keine Transaktionscode zu schreiben.
Eine andere (weniger elegante) Alternative besteht darin, alle atomaren Einheiten der Arbeit in DAOs zu setzen. Sie könnten CRUD-DAOs für die einfachen Operationen und dann kompliziertere DAOs verwenden, die mehr als einen CRUD-Vorgang ausführen. Auf diese Weise bleiben Ihre programmatischen Transaktionen im DAO und Ihre Dienste würden die komplizierteren DAOs aufrufen und müssten sich keine Gedanken über die Transaktionen machen.
Der folgende Link ist ein gutes Beispiel dafür, wie die DAO Muster, das Sie
vereinfachen AO vs ORM(hibernate) pattern
(Thanx @daff)
Beachten Sie, wie die Definition der Schnittstelle es, dass so Code helfen kann, macht Ihre Geschäftslogik kümmert sich nur um das Verhalten von UserDao. Es kümmert sich nicht um die Implementierung. Sie könnten ein DAO mit Hibernate oder nur JDBC schreiben. Sie können also Ihre Datenzugriffsimplementierung ändern, ohne den Rest Ihres Programms zu beeinträchtigen.
mögliche Duplikate von [Ich fand JPA, oder ähnlich, ermutigen nicht DAO-Muster] (http://stackoverflow.com/questions/2100115/i-found-jpa- oder-alike-dont-encourage-dao- Muster) – Bozho
Vielleicht Check-out mein Blog-Post darüber. Ich schlage vor, wie JPA mit DAO-Muster so einfach und DRY wie möglich zu kombinieren: http://codeblock.engio.net/?p=180 – bennidi