Метод в Entity необходимо загрузить все данные из совокупности, как это оптимизировать? - PullRequest
1 голос
/ 03 апреля 2019

У меня проблема с агрегатом, который будет увеличиваться со временем.Однажды будут тысячи записей, и оптимизация будет плохой.

@Entity
public class Serviceman ... {

  @ManyToMany(mappedBy = "servicemanList")
  private List<ServiceJob> services = new ArrayList<>();

  ...


public Optional<ServiceJob> firstServiceJobAfterDate(LocalDateTime dateTime) {
        return services.stream().filter(i -> i.getStartDate().isAfter(dateTime))
                .min(Comparator.comparing(ServiceJob::getStartDate));
    }

}

Метод, просто загружающий весь ServiceJob, чтобы получить только одну из них.Может быть, я должен делегировать этот метод в службу с родным SQL.

1 Ответ

0 голосов
/ 15 апреля 2019

Вы должны проектировать небольшие агрегаты вместо больших.

В этом эссе подробно объясняется, как это сделать: http://dddcommunity.org/library/vernon_2011/. В нем объясняется, как разбить ваши агрегаты на более мелкие, чтобы вы могли управлять сложностью.

В вашем случае вместо Агрегата, состоящего из двух объектов: Военнослужащий и Служба с Военнослужащим , являющимся совокупным корнем, вы можете разложить его на два меньших агрегаты с одной сущностью. ServiceJob будет ссылаться на Serviceman по ID, и вы можете использовать ServicejobRpository для выполнения запросов.

В вашем примере у вас будет ServicejobRpository.firstServiceJobAfterDate (guid servicemanID, DateTime date) .

Таким образом, если у вас много сущностей и вам нужно масштабировать, вы можете сохранить сущности Servicejob на другом сервере БД.

Если по какой-то причине Военнослужащему или Servicejob нужны ссылки друг на друга для выполнения своей работы, вы можете использовать Service , который будет использовать ServicemanRepository и ServicejobRepository для получения обоих агрегатов и передачи их друг другу, чтобы они могли выполнять свою работу.

...