2017-03-07 42 views
0

我工作的公司正在轉換爲Spring Data,我們大多數人仍在學習。我一直在遇到一個問題,我無法將自己的頭圍繞住。如何處理保存或更新與分離實體有關係的實體,這些實體中的值可能需要更改。使用Spring數據保存與現有實體關係的新實體的正確方法

我有服務,rate_plan和service_rate_plan表。 rate_plan表連接了服務和rate_plan表,並且它有一個用於該費率計劃中服務成本的列。

讓我們假設用戶想要創建一個費率計劃。我創建了一個費率計劃DTO,併爲其添加了所有可能的serviceRatePlan的列表。我將這個呈現給用戶。然後用戶添加費率計劃的信息並設置1個或更多服務的費用並提交表格。

現在我有一個費率計劃DTO,其中填寫了一些信息和一份serviceRatePlan列表,這些列表可能會或可能不會有成本。

對於更新,我公司的當前實踐是獲取serviceRatePlan的列表並迭代它,並使用新信息更新現有列表的新列表。

這對我來說似乎不太合適。如果服務列表是10個項目,我想這可能是好的。但是,如果清單是1000件或類似的東西,它似乎對我來說真的是效率低下。

那麼這樣做的正確,最有效的方法是什麼?

這是我當前如何合併我

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

我添加了spring-data-jpa標籤,因爲它聽起來像這就是你正在談論的。如果這是錯誤的,請隨時恢復並用正確的標籤替換它。 –

回答

1

假設你指的春天JPA的數據爲例。

這裏要做的正確的事情是使用JPA的功能,即級聯配置。將參考從RatePlan的級聯選項設置爲ServiceRatePlan到Cascade.ALL,當保存RatePlan時,JPA將負責保存它們。

你可以從這裏開始瞭解更多信息有關級聯:JPA @ManyToOne with CascadeType.ALL

當你想級聯它有助於總結羅茨認爲,你從領域驅動設計可能他們有什麼關係決定。這個想法是你有密切相關的實體的聚合。你的情況RatePlanServiceRatePlan。每個聚合有一個聚合根,在你的情況下RatePlan。然後,您只有Aggregate Roots和通過級聯連接到該根的所有元素的存儲庫,因此您不需要這些存儲庫。另請參見http://static.olivergierke.de/lectures/ddd-and-spring/#ddd.building-blocks.aggregates

+0

術語「聚合根」對我來說非常有用,謝謝。我想回顧我的問題,我試圖找出的主要事情是合併傳入更改的最有效方法。我有一份代表費率計劃和服務之間關係的列表。該列表需要隨傳入更改而更新。現有成本可能會發生變化,新的關係可能會被添加,現有的關係可能會被刪除。我已經將我用來合併數據的方法粘貼到原始問題中。 – RhythmicDevil

相關問題