2017-03-07 39 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