Есть ли способ обновить столбцы в других объектах после обновления ссылочного объекта?
Это объект проекта, который используется в качестве ссылки другими объектами в моем проекте:
@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
также должны быть отражены в двух вышеупомянутых объектах. Вот логика для этого в сервисном классе обновления / вставки сущностей проекта.
@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 ответ
Он также будет поддерживать принцип единой ответственности. и вы также можете опустить цикл. Но в этом есть проблема, каждый раз, когда вы обновляете проект, он будет работать (если это требование, то все в порядке).
Пожалуйста, попробуйте это:-
@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());
}
}