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
}
另外两个实体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
需要反映在上述两个实体中。这是服务类更新/插入项目实体的逻辑。
@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 {}
从这个类中删除这部分并以更好的方式在其他位置进行,因为它违反了单一责任原则?
解决方案
它还将维护单一责任原则。并且您也可以省略循环。但是每次更新项目时都会出现一个问题,它会起作用(如果这是必需的,那很好)。
请试试这个: -
@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());
}
}
推荐阅读
- swift - SwiftUI:内存泄漏
- javascript - 当我需要更改对象中属性的类型时,如何正确使用 TypeScript
- c++ - C++ 字符串流的 EOF 在编译+执行环境之间具有不同的结果
- ios - 如何支持使用 UICollectionViewDiffableDataSource 的快速滚动清理器?
- javascript - Asp.Net MVC 视图如何从后端添加脚本 src?
- artifactory - Artifactory 帐户已锁定
- javascript - 如何访问在另一个函数 JS 中定义的变量值
- three.js - A-Frame & Three.js:彩色地图使对象变白
- c# - 在返回值的异步任务中捕获异常
- javascript - 使用 ical 生成器看不到 Ical 按钮