2017-03-10 1 views
0

Auf der Grundlage der folgenden Anforderungen:Objektmodellierung Eltern-/Kind-Beziehung für Java DTOs für JPA ORM

Haben zwei Endpunkte, respecitively, die ich RestTemplate Client Spring bin mit konsumieren und zwei separate DTOs zu füllen. Dieser Teil ist fertig.

http://www.endpoint.com/Advertisement

enthält folgende JSON Array:

[{"startDate":"2017-01-29","cost":"$50000.00","id":1112,"name":"Porsche"},{"startDate":"2017-03-06","cost":"$27000.00","id":38626,"name":"BMW"}] 

http://www.endpoint.com/Metric

enthält folgende JSON Array:

[{"clicks":1796,"views":13582,"id":20275,"parentId":1112},{"clicks":3295,"views":12697,"id":18564,"parentId":38626}] 

Anforderung 1:

Die Beziehung zwischen den beiden Datentypen ist die einer übergeordneten und untergeordneten Beziehung, Werbung ist die übergeordnete und die metrische ist die untergeordnete. Die Metrik enthält metrische Daten, die zur Beschreibung der Gesamtleistung des übergeordneten Werbebuchungselements verwendet werden können. Sobald die Daten im richtigen Format vorliegen, speichern Sie sie lokal in einer Datenbank Ihrer Wahl. Speichern Sie die Daten in der Datenbank auf der Ankündigungsebene.

Anforderung 2:

eine Methode schreiben, die auf der Datenbank eine Abfrage führt alle Metriken für einen bestimmten übergeordneten Anzeige abzurufen. Geben Sie als nächstes ein Array zurück, das nur eindeutige Metriken enthält, basierend auf der Metrik-ID, und verwenden Sie nur ein Array im Code (d. H. Vor Ort Entfernen von Duplikaten). 3

Voraussetzung:

schreibt Datenbank Befehl/Abfrage (mit der Datenbank der Wahl) Gesamtzahl der Klicks und Ansichten auf der Anzeige Ebene pro Kind Metriken zu berechnen. Speichern Sie diese Werte neben jedem Anzeigenobjekt auf Anzeigenebene.

Also, im Grunde begann ich mit dem Objektdesign wie folgt aus:

@Entity 
public class AdvertisementDto { 
    @Id 
    @GeneratedValue 
    private Long id; 

    private String startDate; 
    private String cost; 
    private String name; 

    // Getter & Setters 
} 

@Entity 
public class MetricsDto extends AdvertisementDto { 

    @Id 
    @GeneratedValue 
    private Long id; 

    private Long parentId; 

    private int clicks; 

    private int views; 

    // Getter & Setters 
} 

Frage (n):

  1. meine ORM-Design ist in Bezug auf die Eltern/Kind für Anforderung richtige Verhältnis 1 ?

  2. Bin verwirrt, wenn mein Objektentwurf für Anforderung # 2 gilt & Anforderung # 3?

  3. Wie würde ich die entsprechende Eltern-ID mit der Super-Klasse (AdvertisementDTO) füllen?

Antwort

1

Für mich haben Sie zwei Einheiten, die in Beziehung zueinander stehen. Ich verstehe auch, dass eine Werbung immer eine Metrik hat und umgekehrt.Wenn ich mich nicht irre kann man es so tun:

@Entity 
public class Advertisement { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @OneToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="metrics_id") 
    private Metrics metrics; 

    private String startDate; 
    private String cost; 
    private String name; 

    // Getter & Setters 
} 

@Entity 
public class Metrics { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @OneToOne(fetch=FetchType.LAZY, mappedBy="advertisement") 
    private Advertisement advertisement; 

    private int clicks; 

    private int views; 

    // Getter & Setters 
} 

Und für das Speichern, Löschen und finden Sie würden diese müssen im Frühjahr-Daten-style:

public interface AdvertisementRepository extends JpaRepository<Advertisement, Long> { 

    List<Advertisement> findAll(); 

} 

public interface MetricsRepository extends JpaRepository<Metrics, Long> { 

    List<Metrics> findAll(); 
    List<Metrics> findAllByAdvertisementId(@Param("advertisementId") Long advertisementId); 

} 

Um zu sehen, wie die Dinge zu ordnen am besten (meiner Meinung nach) hier: https://github.com/khauser/microservices4vaadin/tree/master/microservices/userservice/src/main/java/microservices4vaadin/userservice

um eine Summe zu berechnen Sie brauchen würden, etwas in dieser Richtung zu machen:

@Query("SELECT Coalesce(SUM(b.value),0) AS value " 
    + "FROM Booking b INNER JOIN b.account a " 
    + "WHERE a.itemId = :accountId " 
    + " AND (b.bookingDate <= :toDate OR :toDate IS NULL)") 
Double getAccountBalanceValue(@Param("accountId") Long accountId, @Param("toDate") @DateTimeFormat(iso=ISO.DATE) LocalDate toDate); 
+0

KLHauser - vielen Dank, dass Sie mir einen ersten Pass gegeben haben, ich schätze es sehr. Wie kann ich die in der Metrik befindliche übergeordnete ID der Werbung zuordnen? Ich sehe keine Metrik-ID irgendwo angegeben (soll es nicht einfach nur eine alte "ID" sein)? –

+0

Es gibt keine patentId mehr. Der Zugriff erfolgt über advertisement.getMetrics() oder auf der anderen Seite metrisch.getAdvertisement(). – KLHauser

Verwandte Themen