Ich fand JPA, oder ähnliche, ermutigen nicht DAO-Muster. Ich weiß es nicht, aber ich fühle mich so, besonders mit serververwalteten JTA-Managern.Ich fand JPA, oder ähnlich, ermutigen nicht DAO-Muster
Nachdem ich mich mit DAO-Mustern beschäftigt hatte, begann ich, JPA-basierte Anwendungen nach diesem Muster zu gestalten. Aber es passt nicht hinein, IMO. Ich neige dazu, ziemlich Eigenschaften von JPA und allem zu verlieren.
Nun, nehmen wir an, Sie feuern eine Abfrage mit pessimistischem Locking und es wurde eine Liste von enites von einer DAO-Methode zurückgegeben. Nach der Rückgabe endet die Transaktion und die Sperre ist aufgehoben (ein Fall mit dem vom Server verwalteten JTA-Manager). Also, sinnlos. Es gibt jedoch gültige Fälle.
Ein anderes Beispiel ist viel trivialer. Angenommen, Sie führen eine Abfrage aus, um eine Entität abzurufen, die eine lau- fende Eins-zu-Viele-Verknüpfung mit einer anderen Entität hat. Nach dem Zurückgeben der DAO-Methode endet die Transaktion. Lazy Loading würde nicht mehr funktionieren, Sie erhalten einfach null
oder so. Um das zu bewältigen, laden wir es gerne manuell. Wir machen etwas wie a.getBList().size()
.
Also IMO ist es besser, nicht ein DAO ausschließlich zu machen, und tun Sie es in Ihrem Business-Bean, auf diese Weise können Sie diese nützlichen Funktionen nutzen. Oder ORM API kann wohl als eine DAO/Datenschicht selbst angesehen werden. Also müssen wir kein anderes machen.
Was denken Sie darüber?
Hinweis: Ich sage auf keinen Fall, dass das DAO-Muster veraltet ist. In der Tat hängt es von Fall zu Fall ab.
(+1) Ich stimme darin überein, dass es keinen Grund gibt, eine Dao-Schicht zu erstellen, wenn man nichts Bestimmtes im Sinn hat.Sogar ein generisches DAO, geschweige denn eine separate DAO-Klasse für Entität. – Bozho
Ich habe mich schwer getan, einen guten Weg zu finden, meinen Java EE JAX-RS/JPA-Code zu testen, und es war ein Albtraum, eine praktikable "Container-in-the-Tests" -Lösung zu bekommen. Der Hauptaspekt versucht, einen @ Context PersistenceContext aus den Tests zu injizieren. Ich denke, dass die Verwendung von @ EJB Dao zusammen mit einem Konstruktor, der aus Tests aufgerufen wird und das Dao setzt, sauber ist. –