© DrHitch/Shutterstock.com
JPA 2.1

3 Mapping


Im Bereich „Mapping“ geht es im Wesentlichen um die Mapping-Annotationen und die Frage, wie die relationale Welt (also die SQL-ResultSets) in die Objektwelt (also die Java-Objekte) überführt wird. Aus diesem Bereich sind zwei Features zu vermelden, die im Folgenden beschrieben werden.

3.1 Konstruktor-Mapping

Improved Result Mapping for Native Queries

Die Annotation @SqlResultSetMapping wurde so erweitert, dass Konstruktoren aus den Entities für das Mapping der Daten aus der Datenbank verwendet werden können. Das ermöglicht ein einfaches und intuitives Mapping.

Das Problem in JPA 2.0

Bei Native Queries müssen die Werte der Spalten aus einer Tabelle manuell auf die Attribute der Entities gemappt werden. Dazu bietet der Entity Manager drei Varianten (Listing 3.1).

// Die erste Variante 
createNativeQuery("select c.name, c.area, c.population from " + City.TABLE_NAME + " c")

// Die zweite Variante
createNativeQuery("select c.id, c.name, c.area, c.population from " + City.TABLE_NAME, City.class);

// Die dritte Variante
createNativeQuery("select c.id, c.name, c.area, c.population from " + City.TABLE_NAME + " c", "City_mapping");

Listing 3.1: Drei Varianten, Native Queries zu übergeben

In der ersten Variante gibt die Query eine Liste von Objekten als List<Object[]> zurück, die manuell auf die Attribute der Entities gemappt werden müssen. In der zweiten Variante werden die Spalten der Tabelle automatisch auf die Attribute der als Parameter übergebenen Klasse – hier City – gemappt. Es wird eine Liste von Objekten List<City> der konkreten Klasse zurückgegeben. Das funktioniert aber nur dann, wenn die Anzahl und Namen von Attributen und Spalten übereinstimmen. Wesentlich flexibler ist die Variante drei. Hier wird der Name City_mapping einer Annotation vom Typ @SqlResultSetMapping übergeben. Über die Annotation @SqlResultSetMapping wird das Mapping definiert (Listing 3.2). Die Definition des Mappings über die Annotation @SqlResultSetMapping hat zudem den Vorteil, dass das Mapping an einer Stelle im Sourcecode definiert und damit die Lesbarkeit und die Wartbarkeit der Anwendung erhöht werden.

@SqlResultSetMapping(name = "City_mapping",entities = {
@EntityResult(entityClass=de.gedoplan.buch.
jpademos.entity.City.class,
fields={@FieldResult(column="name", name="name"),
@FieldResult(column="area", name="area"),
@FieldResult(column="area", name="area")}) }

Listing 3.2: Definition der Mapping Annotation

Nachteil der Annotation ist, dass die Definition des Mappings sehr aufw...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang