Für das Mapping eines Objekts der Logikschicht auf eines der Persistenzschicht benötige ich eine Art Mapper. Zunächst habe ich mir dafür eine Mapperklasse geschrieben, in der ich per Hand ein Objekt eines Typs A in ein Objekt des Typs B umgewandelt habe. Dafür habe ich mir ein sehr einfaches Schema entwickelt und daraus meine Klassen mit JAXB generiert. Für jede Modelklasse musste außerdem eine äquivalente JPA-Klasse erstellt werden. Diese Modelklassen wollte ich nun mit Hilfe der Mapperklasse in eine Klasse mit JPA-Annotationen überführen. Der folgende kurze Codeausschnitt aus der Mapperklasse zeigt das Verfahren:
public class EntityMapper {
public static JpaEntity getJpaEntity(Model model) {
JpaEntity entity = null;
if (model instanceof Adresse) {
entity = new AdresseJpaEntity();
((AdresseJpaEntity) entity).setId(((Adresse) model).getId());
((AdresseJpaEntity) entity).setStrasse(((Adresse) model).getStrasse());
((AdresseJpaEntity) entity).setNummer(((Adresse) model).getNummer());
((AdresseJpaEntity) entity).setOrt(((Adresse) model).getOrt());
((AdresseJpaEntity) entity).setPlz(((Adresse) model).getPlz());
return entity;
}
else if (model instanceof Artikel) {
entity = new ArtikelJpaEntity();
((ArtikelJpaEntity) entity).setId(((Artikel) model).getId());
((ArtikelJpaEntity) entity).setBezeichnung(((Artikel) model).getBezeichnung());
((ArtikelJpaEntity) entity).setHersteller(((Artikel) model).getHersteller());
((ArtikelJpaEntity) entity).setPreis(((Artikel) model).getPreis());
}
...
}
}
Bereits bei diesen wenigen einfachen Modelklassen hat sich gezeigt, dass das Mappen einen enormen zusätzlichen Aufwand bedeutet. In dem Beispiel ist das Mapping nur für zwei Klassen und nur von Model zu JPA-Entity dargestellt.
Nach einigen Gesprächen mit anderen Entwicklern wurde mir "Dozer" (http://dozer.sourceforge.net/documentation/about.html) empfohlen. Dozer nimmt genau diese Arbeit ab. Das Framework ist sehr einfach einzubinden. Bereits die folgenden Zeilen genügen um ein Mapping zubewirken:
AdresseJpaEntity adresseJpaEntity;
Adresse adresse = new Adresse("Musterstraße","1a","02826","Görlitz");Mapper mapper = new DozerBeanMapper();
adresseJpaEntity = mapper.map(adresse, AdresseJpaEntity.class); Dozer erkennt anhand des Names der Klassenattribute welche Attribute aufeinander zu mappen sind. Falls man sich nicht an diese Konvention halten will, man die Mappingregeln in einer XML-Datei spezifizieren.