Domain Builder - HeilOliver/Roomix GitHub Wiki

Domain Builder

Der Domain Builder ist eine Klasse bzw. eine Sammlung von Klassen, um Domänenobjekte mit Datenbank Entities zu befüllen. Der Domain Builder befindet sich in der Persistenz Schicht und verwendet DAOs (Data Access Objects), um per Hibernate Datenbankoperationen auszuführen. Die Domänenobjekte selber enthalten die Domänenlogik sowie die zugehörigen Daten, die darin gespeichert werden.

AbstractDomainBuilder

Eine generische abstrakte Klasse, die verwendet wird, um weitere Builder für bestimmte Domänenobjekte und Entities zu erstellen. Die Sub-Klasse die vom "AbstractDomainBuilder" erbt enthält lediglich das explizite Mapping für in der Entity enthaltenen weiteren Entities und einige Wrapper Methoden, um den Zugriff von außen ohne eine Verletzung der Schichtenarchitektur durchführen zu können.

Methoden

Statische Methoden

  • private static <S, D> Collection<D> mapCollection(Collection<S> sourceModels, Class<D> destinationType)
    Description: Wenn eine Entity über eine oder mehrere ManyToOne Beziehung verfügt und man die zugehörigen darin vermerkten Entites auf eine weitere Domain mappen möchte, verwendet man die statische Methode mapCollection.
    Verwendung: Collection<ContactNoteDomain> contactNoteDomains = mapCollection(contactEntity.getContactnotesByContactId(), ContactNoteDomain.class);
    Ruft man mapCollection auf übergibt man als Source die Collection an Entities und als Destination die gewünschte Klasse, welche man als Collection Typ zurückbekommen möchte (siehe Beispiel). Die erhaltene Collection mit den Domains als Inhalt muss dann noch auf das entsprechende Ziel gesetzt werden (mit einem Setter beispielsweise).

Interne Methoden (protected)

Diese Methoden dienen grundlegend dazu, um möglichst einfach zwischen 2 Objekten Daten zu mappen.

  • protected void put(Class destinationType, ISourceMapper<Collection> sourceMapper, IDestinationMapper<Collection> destinationMapper, LinkedHashMap<ISourceMapper<Collection>, Map.Entry<Class, IDestinationMapper<Collection>>> mapping)
    Description: Möchte man explizit von einer Collection an Objekten auf eine Collection anderer Objekte mappen kann man dies vereinfacht über diese Methode lösen. Die zugehörigen Mappings werden in die übergebene Liste gespeichert und beim Aufruf der später erklärten Methode mapAllCollections vollautomatisch gemapped. Dazu müssen Getter, Setter und der Typ der gewünschten Klasse übergeben werden. Zum übergeben des Getters verwendet man eine anonyme Implementierung vom Typ "ISourceMapper". Für den Setter wird "IDestinationMapper" verwendet. Als destinationType übergibt man den Typ der Klasse die man zurückbekommen möchte.
    Verwendung: put(ContactNoteDomain.class, contactEntity::getContactnotesByContactId, guestDomain::setContactNotes, mapping);
    ContactNoteDomain wird gefüllt mit Hilfe des Getters der "contactEntity". Später wird das Ergebnis des Mappings in Form der angebenen Klasse ContactNoteDomain in die Klasse "guestDomain" mit Hilfe des übergebenen Setters gespeichert.

  • protected void mapAllCollections(LinkedHashMap<ISourceMapper<Collection>, Map.Entry<Class, IDestinationMapper<Collection>>> mapping)
    Description: Dieser Methode übergibt das zuvor per put festgelegte Mapping und führt so das komplette Mapping vollautomatisch aus.
    Verwendung: mapAllCollections(mapping);

Vererbte Methoden (abstract protected)

GuestDomainBuilder (Beispiel)

Die Verwendung ist recht einfach und wohl im "Großen und Ganzen" besser verständlich ;)
GuestDomainBuilder stellt einen Domänenobjekt namens "GuestDomain" zur Verfügung das widerrum weiterere Domänenobjekte enthält, welche in der Datenbank einer ManyToOne Beziehung entsprechen. Diese ManyToOne Beziehungen sind auch in "Entity" zu finden. Diese Entites stellen lediglich Datenobjekte dar, welche Hibernate verwendet. Der GuestDomainBuilder übernimmt hierbei also das Mapping und hängt an die "GuetDomain" Dinge wie Personen, Vertragspartner, Kreditkarteninformationen usw. (eben alles was in der Datenbank an der Entity hängt). Das implizite Mapping heißt also: source: ContactEntity -> destination: GuestDomain.

Hier geht's dann zum Beispiel

⚠️ **GitHub.com Fallback** ⚠️