Frage

Lassen Sie uns sagen, ich habe beschlossen, mit Java EE-Stack für meine Enterprise-Anwendung zu gehen.

Nun, für Domain-Modellierung (oder: für die M von MVC Gestaltung)?, Die APIs kann ich davon ausgehen und Verwendung sicher und welche sollte ich bleiben weg von ... sagen wir, über eine Abstraktionsschicht

Beispiel:

  1. Soll ich voran gehen und mein Wurf Modell mit Anrufen zu Hibernate / JPA-API? Oder sollte ich eine Abstraktion ... eine Persistenz-Schicht meiner eigenen zu vermeiden Hartcodierung gegen diese beiden spezifischen Persistenz APIs bauen? Warum ich das fragen: Vor einigen Jahren gab es diesen Kodo-API, die von Hibernate abgelöst wurde. Wenn man eine Persistenz-Schicht und codiert entworfen hatte (das Modell mit Anrufen zu bestimmten Anbieter API anstelle von Littering), um den Rest des Modells gegen diese Schicht, wäre es ein zu (relativ) erlaubt haben, schalten leicht von Kodo zu Hibernate xyz.

  2. Ist es empfehlenswert, aggressive Verwendung des * QL durch Ihre Persistenz-Anbieter in Ihrem Domain-Modell zur Verfügung gestellt zu machen? Ich bin keine Kenntnis von der realen Welt Probleme (wie Leistung, Skalierbarkeit, Mobilität, usw.), die aus einem schweren Einsatz einer HQL-ähnliche Sprache. Warum frage ich dies:. Ich mag vermeiden, so viel wie möglich, benutzerdefinierten Code zu schreiben, wenn das gleiche über Abfragesprache erreicht werden könnte, die mehr tragbar als SQL ist

Sorry, aber ich bin ein kompletter Neuling auf dieses Gebiet. Wo könnte ich weitere Informationen zu diesem Thema finden?

War es hilfreich?

Lösung

Hier ist, was ich glaube, dass die traditionelle Sicht ist:

  • Die Entitäten in Ihrem Projekt das Domänenmodell bilden. Sie sollten auf eine Persistenz-Technologie wiederverwendbar und nicht eng gekoppelt sein (ich komme später wieder zu eng gegen lose Kopplung)
  • Die Business-Schicht, verwendet das Domänenmodell, sondern auch aussetzt Dienstleistungen und andere Stoffe.
  • Die Datenzugriffsschicht verantwortlich ist, das Domänenmodell (Entitäten) in einem persistenten Speicher zu bestehen.

Ein Unternehmen sollte die Datenzugriffsschicht nicht direkt aufrufen. Aber die Business-Schicht wird in einer Art und Weise zu laden und beharren Einheiten des Domänenmodell.

Wenn Sie das auf Java EE Technologien Karte erhalten Sie in der Regel etwas wie:

  • Unternehmen -> POJO mit Hibernate / JPA-Annotationen. Beachten Sie, dass Anmerkungen nicht über eine enge Kopplung mit JPA / Hibernate implizieren, ganz gleich POJO woanders ohne Hibernate verwendet werden könnte.
  • Handelsebene -> Session EJB oder Frühling
  • Datenzugriffsschicht -> JPA / Hibernate

Das ist eine grobe Skizze, und es gibt viele mögliche Varianten. Sie können insbesondere die Session EJB überspringen und die Business-Schicht eine andere Art und Weise umzusetzen. Sie können auch die Business-Schicht Aufruf der JPA / Hibernate Session / EntityManager direkt haben entscheiden, in welchem ??Fall JPA / Hibernate wirklich die DAL ist, oder Sie können den Zugang in die Session / EntityManager wickeln wollen so genannte Data Access Objects (DAO ).

In Bezug auf HQL, versuchen zu halten, was ist tragbar, und wenn Sie ein neueres SQL verwenden, folgen Sie SQL-92-Konventionen. Wenn stopft kompliziert werden, führen vielleicht DAOs. Auf diese Weise wissen Sie, dass der einzige Ort, wo es HQL-Abfragen in dem DAOs ist. Sie können auch zuerst die Abfragelogik „prozedural“ in der DAO implementieren, und wenn Sie Performance-Problem haben, neu implementieren es mit einer komplizierteren HQL-Abfrage.

Bearbeiten

In Bezug auf Ihre Fragen im Kommentar:

Die Business-Schicht ist abhängig von der Datenschicht. Wenn Sie die Business-Schicht soll nicht auf Hibernate / JPA hängen Ihre Datenschicht müssen dann auf abstrakt Hibernate / JPA entfernt. Wenn Sie DAO für Ihre Datenschicht verwenden, wird das der Fall sein. Die DAO wird die „dünne handgeschriebene Persistenz-Schicht über Hibernate“ sein (Ihre Worte zu nehmen). Ich würde DAO für alle Entitäten in Ihrem Fall einführen.

Was ist Ihr fragen ist eine ziemlich allgemeine Design Frage. Ich kann kein endgültiges Rezept dafür geben, noch möglicherweise alle Varianten in einer Antwort zusammenfassen, wie es von Fall zu Fall abhängig ist. So sprachen wir weit über das Problem der Transaktionen nicht so, dass Sie in der Regel in der Business-Schicht beginnen, sondern, dass die Datenschicht bewusst sein muß. Dies hängt typischerweise von den verwendeten Technologien und Ihren Anforderungen.

Dennoch ist hier eine Liste von Ressourcen, die Sie interessieren könnten: die Bücher Pattern of Enterprise Application Architecture , das Buch Real World Java EE Patterns - Rethinking Best Practices , das Buch Domain Driven Design und insbesondere die Muster Data Access Object , Repository Muster , Open Session in View (wenn es für einen Web-App ), Und vielleicht Anemic Domain Model .

EDIT 2

Ok, ein paar Sätze überTransaktionen:

Die Transaktionen sollten konzeptionell in der Business-Schicht verwaltet werden; die Definition dessen, was in einer Einheit der Arbeit getan werden muss, konsequent zu sein, hängt in der Tat auf der Logik der Anwendung.

Mit EJB3 können Transaktionen mit Anmerkungen und der App deklariert werden. Server verwaltet das für Sie. Sehen Sie diese andere Antwort von mir für mehr Informationen. Mit Frühling können Sie markieren auch die Transaktionen deklarativ, aber ich weiß nicht, die Details. Andernfalls müssen Sie zum Starten / die Transaktion selbst stoppen. Dies wird etwas anders, ob Sie JDBC-Transaktionen oder JTA-Transaktionen verwenden.

Transaktionen bezieht sich auch auf ein träges Laden in Hibernate / JPA. Ein Unternehmen, das geladen war faul, kann in der Tat nur dann geladen werden, wenn es eine aktuelle Transaktion ist. Wenn die Transaktionen in der Business-Schicht beendet ist, Entitäten, die an der Präsentationsschicht muß zurückgegeben werden, mit Spannung geladen werden.

Um dieses Problem zu umgehen, ein beliebtes Muster für Web-Anwendungen ist Open Session in Ansicht , die ich bereits erwähnt. In diesem Fall stoppt die Präsentationsschicht Start / Transaktionen (die leicht falsch konzeptionell ist), aber funktioniert gut mit verzögertes Laden.

Andere Tipps

Ihr Domain-Modell und seine Persistenz-Schicht in der Theorie getrennt sein sollte - es gibt keine Notwendigkeit für eine Klasse namens Entity etwas zu wissen, ob und wie es beibehalten wird, so dass Sie so etwas wie Hibernate verwenden könnten die Persistenz-Schicht zu erzeugen, ohne die umweltbelastenden Domänenmodell Klassen selbst. Sie nicht „Code des [...] Modell gegen diese Schicht“ - Sie die Modell-Code, wo es dann zu einem persistenten Speicher mit irgendeiner Art von ORM-Schicht, wo das Domänenmodell nicht auf der ORM-Schicht abhängt. Offensichtlich ist die Persistenz-Schicht auf dem Domänenmodell abhängen, aber das ist in Ordnung.

Ich kämpfe persönlich schüchtern zu viel HQL der Verwendung mit (N) Hibernate für den Grund, warum Sie fragen, aber es gibt Zeiten, in denen es unvermeidbar ist. Sie wissen bereits, und haben selbst hervorgehoben, das Hauptproblem gibt, so werden Sie kaum diese ohnehin zu häufig zu benutzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top