Java 在更新引用实体后,是否有方法更新其他实体中的列?
这是我的项目中其他实体用作参考的项目实体:Java 在更新引用实体后,是否有方法更新其他实体中的列?,java,spring,spring-boot,jpa,single-responsibility-principle,Java,Spring,Spring Boot,Jpa,Single Responsibility Principle,这是我的项目中其他实体用作参考的项目实体: @Entity @Data @RequiredArgsConstructor @AllArgsConstructor public class Project { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; @NonNull private String projectName; @NonNull priv
@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
}
另外两个实体花名册
和外包请求表
,在创建时从项目实体复制字段项目名称
和资源大小
@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
}
对字段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());
});
}
}
@服务
公共类ProjectServiceImpl实现ProjectService{
@自动连线项目库projectRepo;
@自动连线ProjectWebClient服务ProjectWebClient服务;
@自动连线罗斯特服务罗斯特服务;
@自动连线外包服务或服务;
/**
*
*/
public void updateProjectData(){
//删除现有记录
projectRepo.deleteAll();
//从其他服务器获取数据
List projectList=projectWebClientService.getProjectData();
//保存项目数据
projectRepo.save(projectList);
//----->以下部分需要解决方案{
//按项目名称查找名册并更新resourceSize
updateRoster(project.getProjectName(),project.getResourceSize());
//按项目名称查找orf并更新resourceSize
orfService.updateOrf(project.getProjectName(),project.getResourceSize());
});
}
}
我有没有办法从这个类中删除这个部分
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());
}
}
@自动连线,不能工作,所以需要手动获取bean对象来更新花名册和Orfthanks以获得答案。您是否可以为PostUpdate注释添加导入,我将对此进行检查
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());
}
}