首页 > 解决方案 > 更新参考实体后有什么方法可以更新其他实体中的列?

问题描述

这是项目实体,我的项目中的其他实体用作参考:

@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

}

另外两个实体RosterOutsourceRequestForm它们在创建时复制字段projectNameresourceSize项目实体。


@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 {}从这个类中删除这部分并以更好的方式在其他位置进行,因为它违反了单一责任原则

标签: javaspringspring-bootjpasingle-responsibility-principle

解决方案


它还将维护单一责任原则。并且您也可以省略循环。但是每次更新项目时都会出现一个问题,它会起作用(如果这是必需的,那很好)。

请试试这个: -

@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());
         }

    }

推荐阅读