[英]Is there any way to update columns in other entities after updating reference entity?
这是项目实体,它被我项目中的其他实体用作参考:
@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
的更改也需要反映在上述两个实体中。 这是服务 class 更新/插入项目实体的逻辑。
@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());
});
}
}
有什么办法可以从这个 class 中删除这部分projectList.forEach {}
并以更好的方式在其他位置进行,因为它违反了 单一责任原则?
它还将维护单一责任原则。 并且您也可以省略循环。 但是每次更新项目时都会出现一个问题,它会起作用(如果这是必需的,那很好)。
请试试这个: -
@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());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.