Maven Wie Persistence Module aufteilen

mvitz

Top Contributor
Hallo,

Maven2 schlägt ja als Best-Practice vor, für die Persistence mindestens zwei Module (API und Implementierung) vorzusehen, damit man im Nachhinein die Art der Persistence austauschen kann.

Ins API Modul gehören dabei die Klassen, die persistiert werden sollen, sowie die Interfaces, die CRUD ermöglichen.

Angenommen eine mögliche Persistenzimplementierung möchte JPA2 nutzen und dazu mit Annotationen arbeiten. Dann hat ja mein Persistence-API eine Abhängigkeit zu JPA2 die ich eigentlich nicht haben möchte. Wie handhabt ihr das?
 
Naja, so ganz ohne Abhängigkeiten wirst du wohl nicht auskommen:

mindestens zwei Module (API und Implementierung)

Die verwendete API hängt ja auch von dem für die Persistenz verwendeten Framework ab. Oder gibt es
mittlerweile eine allgemeingültige, superflexible Persistenz-API die mit ALLEM zusammenarbeitet
und ich habe es nur noch nicht mitbekommen ;-)
 
Hi mvitz 🙂

Maven2 schlägt ja als Best-Practice vor, für die Persistence mindestens zwei Module (API und Implementierung) vorzusehen, damit man im Nachhinein die Art der Persistence austauschen kann.
Wirklich? Ist mir neu, aber mit Persistenz/JPA hatte ich in letzter Zeit wenig zu tun.

Angenommen eine mögliche Persistenzimplementierung möchte JPA2 nutzen und dazu mit Annotationen arbeiten. Dann hat ja mein Persistence-API eine Abhängigkeit zu JPA2 die ich eigentlich nicht haben möchte. Wie handhabt ihr das?
Wie meinst du das genau?
Du wirst ja wohl kaum die Interfaces annotieren.

der gibt es
mittlerweile eine allgemeingültige, superflexible Persistenz-API die mit ALLEM zusammenarbeitet
und ich habe es nur noch nicht mitbekommen
JDO vielleicht?
 
Danke schon mal für die Rückmeldungen.

Bzgl. Best-Practices, es wird halt im Maven Book (Maven by Example: Chapter7.Multi-module Enterprise Project) so gemacht. Wobei mir da gerade auffällt, dass auch dort die Modellklassen (Modul: simple-model) direkt Hibernate Annotationen haben, die Persistenz aber im Modul simple-persist gemacht wird.

Bezüglich Interfaces annotieren. Nein natürlich nicht, folgendes, ich habe ein Modul in dem meine Modellklassen sind und in denen sich dann Interfaces befinden, die für die Persistierung sorgen sollen.

Java:
public class MyModel {
  ...
}

public interface MyModelRepository {
  MyModel findById(long id);
  List<MyModel> findAll();
  MyModel save(MyModel model);
...
}

Die konkrete Implementierung der Interfaces soll in einem eigenen Modul erfolgen. Möchte ich jetzt JPA2 nutzen, dann muss ich ja die Klasse MyModel annotieren. Demnach, hat das Modul in dem sich die Modelklassen befinden eine Abhängigkeit zu JPA2. Entscheide ich mich später dafür, die Persistenz doch mit JDBC zu machen, so habe ich die Abhängigkeit zu JPA2 zwar noch, nutze sie aber gar nicht.
 
Ok jetzt verstehe ich dich, danke für den Link.

Denke man sollte es nicht als Maven2 Best-Practices sehen, bestimmte Dinge immer in Module auszulagern, Maven2 bietet eben nur den Mechanismus der Module, wie man den nutzt, kommt immer darauf an.

Wenn man ein Domainmodel hat das man mit JPA annotieren möchte, hat man immer eine Abhängigkeit zu JPA, also Peristenz im Domänenmodell (nach DDD ist das auch ok, denn da trennt man nicht nach Infrastruktur sondern nach fachlichen Aspekten).
JPA ist eben nicht so flexibel wie zB, JDO, JPA geht immer von ORM aus und damit von einem RDBMS, hat man Abhängigkeiten zu JPA, ist es klar dass man eben ein RDBMS braucht und ein JPA Implementierung.

Das Beispiel in deinem Link hat eben genau das: Abhängigkeiten zu JPA im Simple-Model Modul, der Annotationen wegen.
Wenn man auch Annotationen verzichtet und stattdessen komplett auf die orm.xml setzt, hätte dass Simple-Model Modul keine Abhängigkeit zu JPA.

Man muss sich halt überlegen wie viel Flexibilität man wirklich braucht, denn der Aufwand steigt beträchtlich, wenn man niemals umsteigt auf plain JDBC, hat man die Komplexität ohne echte Rechtfertigung in die Höhe getrieben.
 
Wenn ich das halbwegs verstanden habe, dann empfiehlt das Buch in Kapitel 7.10 eher so eine Aufteilung.

Java:
//IMPL
public class MyModel implements IMyModel {
  ...
}

//API
public interface IMyModel{
...
}

public interface MyModelRepository {
  MyModel findById(long id);
  List<MyModel> findAll();
  MyModel save(IMyModel model);
...
}

Damit hast du dann eigentlich keine Abhängigkeiten zu JPA oder was auch immer.
Es bleibt allerdings der Mehraufwand sich die ganzen Interface zu erstellen.
 
Das hast du nicht richtig bzw. nicht ganz verstanden JohannisderKaeufer 😉

simple-model

This module defines a simple object model which models the data returned from the Yahoo! Weather feed. This object model contains the Weather, Condition, Atmosphere, Location, and Wind objects. When our application parses the Yahoo! Weather feed, the parsers defined in simple-weather will parse the XML and create Weather objects which are then used by the application. This project contains model objects annotated with Hibernate 3 Annotations. These annotations are used by the logic in simple-persist to map each model object to a corresponding table in a relational database.
Durch die Annotationen kommen die Abhängigkeiten zu JPA ins simple-model Modul.
 

Neue Themen


Zurück
Oben