有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在更新引用实体之后,有没有办法更新其他实体中的列?

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

@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 {},并在其他位置以更好的方式执行它,因为它违反了single responsibility principle


共 (1) 个答案

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