2017-03-07 1 views
0

Die Firma, für die ich arbeite, konvertiert zu Spring Data und die meisten von uns lernen noch. Ich laufe immer wieder auf ein Problem, das ich nicht richtig verstehen kann. Wie behandelt man das Speichern oder Aktualisieren einer Entität, die eine Beziehung zu getrennten Entitäten hat, bei denen Werte in diesen Entitäten geändert werden müssen?Korrekte Methode zum Speichern einer neuen Entität mit Beziehungen zu vorhandenen Entitäten mit Spring Data

Ich habe Service, Rate_plan und Service_rate_plan Tabellen. Die Tabelle rate_plan verbindet die Tabellen service und rate_plan und enthält eine Spalte für die Kosten des Dienstes in diesem Tarifplan.

Nehmen wir an, dass ein Benutzer einen Tarif erstellen möchte. Ich erstelle einen Rate Plan DTO und füge eine Liste aller möglichen ServiceRatePlans hinzu. Ich präsentiere dies dem Benutzer. Der Benutzer fügt dann Informationen für den Tarif hinzu und legt die Kosten für einen oder mehrere der Dienste fest und reicht das Formular ein.

Jetzt habe ich eine Rate Plan DTO mit einigen Informationen ausgefüllt und eine Liste von ServiceRatePlan, die möglicherweise oder nicht kosten.

Für ein Update die aktuelle Praxis in meinem Unternehmen ist eine Liste der ServiceRatePlan holen und es zu iterieren und die neue Liste aktualisiert die bestehende Liste mit den neuen Informationen.

Das scheint einfach nicht richtig zu mir. Wenn die Serviceliste 10 Elemente umfasste, dann könnte es in Ordnung sein. Aber wenn die Liste 1000 Artikel oder so ähnlich wäre, wäre es meiner Meinung nach wirklich ineffizient.

Was also ist die richtige, effizienteste Art, dies zu tun?

Dies ist ein Beispiel dafür, wie ich zur Zeit bin ich verschmelzenden

protected void buildServiceListFromDto(RatePlan ratePlan, List<RatePlanServiceClassDto> serviceClasses) 
{ 
    Set<ServiceRatePlan> servicesForRatePlan = new HashSet<>(); 
    ratePlan.setServicesForRatePlan(servicesForRatePlan); 

    if (serviceClasses != null) 
    { 
    for (RatePlanServiceClassDto serviceClassDto : serviceClasses) 
    { 
     if (serviceClassDto.getServices() != null) 
     { 
     for (RatePlanServiceDto serviceDto : serviceClassDto.getServices()) 
     { 
      /* 
      * Looking at the servrate table it looks as though empty values are not stored. 
      */ 
      if (StringUtils.isNotEmpty(serviceDto.getAmount().toString())) 
      { 
      ServiceRatePlan serviceRatePlan = new ServiceRatePlan(); 
      serviceRatePlan.setAmount(serviceDto.getAmount().getValue()); 
      serviceRatePlan.setRatePlan(ratePlan); 
      Service service = serviceRepository.findOne(serviceDto.getNumber()); 
      serviceRatePlan.setService(service); 
      servicesForRatePlan.add(serviceRatePlan); 
      } 
     } 
     } 
    } 
    } 
} 
+1

Ich habe das spring-data-jpa-Tag hinzugefügt, da es sich so anhört, worüber du sprichst. Fühlen Sie sich frei, um es zu ersetzen und es mit dem richtigen Tag zu ersetzen, wenn das falsch war. –

Antwort

1

Sie beziehen sich auf Spring Data JPA Unter der Annahme.

Hier ist es richtig, die Funktionen von JPA zu verwenden, nämlich die Kaskadenkonfigurationen. Setzen Sie die Option "Kaskade" der Referenzen von RatePlan auf ServiceRatePlan auf Cascade.ALL, und JPA speichert sie beim Speichern der RatePlan.

Sie hier für weitere Informationen über die Kaskade starten: JPA @ManyToOne with CascadeType.ALL

Wenn auf der Entscheidung, welche Beziehungen Sie kaskadieren wollen es in Aggregate Roots zu denken hilft, wie Sie vielleicht sie von Domain-Driven Design. Die Idee ist, dass Sie Aggregate von eng verwandten Entitäten haben. In Ihrem Fall RatePlan und ServiceRatePlan. Jedes Aggregat hat eine Aggregatwurzel, in Ihrem Fall RatePlan. Sie haben dann nur Repositorys für Aggregatwurzeln und alle Elemente, die über Kaskaden mit diesem Stamm verbunden sind, sodass Sie keine Repositories für diese benötigen. Siehe auch http://static.olivergierke.de/lectures/ddd-and-spring/#ddd.building-blocks.aggregates

+0

Der Begriff "Aggregat Root" ist sehr nützlich für mich, danke. Ich denke, wenn ich auf meine Frage zurückblicke, dann ist die wichtigste Sache, die ich herausfinden möchte, die effizienteste Möglichkeit, die eingehenden Änderungen zusammenzuführen. Ich habe eine Liste, die die Beziehungen zwischen dem Tarif und den Diensten darstellt. Die Liste muss mit den eingehenden Änderungen aktualisiert werden. Vorhandene Kosten können sich ändern, neue Beziehungen können hinzugefügt werden und vorhandene können entfernt werden. Ich habe in die ursprüngliche Frage die Methode eingefügt, die ich verwende, um die Daten zusammenzuführen. – RhythmicDevil

Verwandte Themen