有什么方法可以在更新参考实体后更新其他实体的列?

问题描述 投票:0回答:1

这是一个项目实体,在我的项目中被其他实体用作参考。

@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 {} 从这个班级开始,用更好的方式在其他地方做,因为它违反了。单一责任制 ?

java spring spring-boot jpa single-responsibility-principle
1个回答
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());
         }

    }
© www.soinside.com 2019 - 2024. All rights reserved.