Есть ли способ обновить столбцы в других объектах после обновления ссылочного объекта? - PullRequest
1 голос
/ 26 апреля 2020

Это объект проекта, который используется в качестве ссылки другими объектами в моем проекте:

@Entity
@Data
@RequiredArgsConstructor
@AllArgsConstructor
public class Project {

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

    @NonNull private String projectName;
    @NonNull private String projectCode;
    @NonNull private String description;

    @NonNull private Integer resourceSize;

    //other fields

}

Еще два объекта Roster и OutsourceRequestForm, которые копируют поля projectName и resourceSize из проекта Сущность при создании.


@Entity
@Data
@RequiredArgsConstructor
@AllArgsConstructor
public class Roster {

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

    @Version
    private Long version;

    @NonNull private String projectName;
    @NonNull private Integer resourceSize;

    //other fields

}
@Entity
@RequiredArgsConstructor
@Data
public class OutsourceRequestForm {

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

    @Version
    private Long version;

    @NonNull private String projectName;
    @NonNull private Integer resourceSize;

    //other fields

}

Изменение в поле resourceSize также должно быть отражено в двух вышеуказанных сущностях. Вот лог c для этого в обновлении / вставке объектов класса обслуживания.

@Service
public class ProjectServiceImpl implements ProjectService {

    @Autowired ProjectRepository projectRepo;

    @Autowired ProjectWebClientService projectWebClientService; 

    @Autowired RosterService rosterService;
    @Autowired OutsourceRequestFormService orfService;

    /**
     * 
     */
    public void updateProjectData() {
        //delete existing records
        projectRepo.deleteAll();
        //fetch data from other server
        List<Project> projectList = projectWebClientService.getProjectData(); 
        //save project data
        projectRepo.save(projectList);

        // ---->   need solution for below part   <----
        projectList.forEach(project-> {
            //find rosters by projectName and update resourceSize
            rosterService.updateRoster(project.getProjectName() ,   project.getResourceSize());
            //find orf by projectName and update resourceSize
            orfService.updateOrf(project.getProjectName() ,   project.getResourceSize());
        });
    }

}

Можно ли как-нибудь удалить эту часть projectList.forEach {} из этого класса и сделать это в каком-то другом месте в лучше, так как нарушает принцип единоличной ответственности ?

1 Ответ

1 голос
/ 28 апреля 2020

Он также будет поддерживать принцип единой ответственности. и вы также можете опустить l oop. Но есть проблема в этом каждый раз, когда вы обновляете проект, он будет работать (если это требование, тогда это нормально).

Пожалуйста, попробуйте это: -

@Entity
@Data
@RequiredArgsConstructor
@AllArgsConstructor
**@EntityListeners({RosterListener.class ,OrfListener.class})**
public class Project {

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

    @NonNull private String projectName;
    @NonNull private String projectCode;
    @NonNull private String description;

    @NonNull private Integer resourceSize;

    //other fields

}

Слушатель: -

import javax.persistence.PostUpdate;
    public class RosterListener{

        @PostUpdate
         void onProjectUpdate(Project roject) {
            RosterService  rosterService = (RosterService ) BeanUtility.getBean("RosterService "); // find this as from your application context environment
            osterService.updateRoster(project.getProjectName(), project.getResourceSize());
         }

    }

import javax.persistence.PostUpdate;
    public class OrfListener{

        @PostUpdate
         void onProjectUpdate(Project roject) {
            OutsourceRequestFormService   outsourceRequestFormService  = (OutsourceRequestFormService  ) BeanUtility.getBean("outsourceRequestFormService  "); // find this as from your application context environment
            outsourceRequestFormService.updateOrf(project.getProjectName(), project.getResourceSize());
         }

    }
...