更新过程应该如何实施?是否建议对所有属性进行强制更新(第一个示例),或者我应该添加空检查条件以允许部分更新(第二个示例)?
第一个示例
@transactional
@override
public teamdto updateteambyid(long id, teamdto teamdto) throws apiexception {
optional<team> teamoptional = teamrepository.findbyid(id);
if (teamoptional.ispresent()) {
team existingteam = teamoptional.get();
// if objects id are sent in json, set attributes via id.
if (teamdto != null) {
if(teamdto.getcity() != null){
if (teamdto.getcity().getid() != null) {
citydto citydto = cityserviceimp.getcitybyid(teamdto.getcity().getid());
existingteam.setcity(citymapper.citydtotocity(citydto));
} else if(teamdto.getcity().getname() != null){
existingteam.setcity(citymapper.citydtotocity(cityserviceimp.createcity(teamdto.getcity())));
}
}
if(teamdto.getstadium() != null){
if (teamdto.getstadium().getid() != null) {
stadiumdto stadiumdto = stadiumserviceimp.getstadiumbyid(teamdto.getstadium().getid());
existingteam.setstadium(stadiummapper.stadiumdtotostadium(stadiumdto));
} else if(teamdto.getstadium().getname() != null){
existingteam.setstadium(stadiummapper.stadiumdtotostadium(stadiumserviceimp.createstadium(teamdto.getstadium())));
}
}
if(teamdto.getdivision() != null){
if (teamdto.getdivision().getid() != null) {
divisiondto divisiondto = divisionserviceimp.getdivisionbyid(teamdto.getdivision().getid());
existingteam.setdivision(divisionmapper.divisiondtotodivision(divisiondto));
} else if(teamdto.getdivision().getname() != null){
existingteam.setdivision(divisionmapper.divisiondtotodivision(divisionserviceimp.createdivision(teamdto.getdivision())));
}
}
return teammapper.teamtoteamdto(teamrepository.save(existingteam));
}
}
throw new teamnotfoundexception(id);
}第二个示例
@Transactional
@Override
public TeamDTO updateTeamById(Long id, TeamDTO teamDTO) throws ApiException {
Team team = teamMapper.teamDTOToTeam(teamDTO);
Optional<Team> teamOptional = teamRepository.findById(id);
if (teamOptional.isPresent()) {
Team existingTeam = teamOptional.get();
existingTeam.setName(team.getName());
existingTeam.setDivision(team.getDivision());
existingTeam.setCity(team.getCity());
existingTeam.setStadium(team.getStadium());
existingTeam.setHomeMatches(team.getHomeMatches());
existingTeam.setAwayMatches(team.getAwayMatches());
return teamMapper.teamToTeamDTO(teamRepository.save(existingTeam));
}
throw new TeamNotFoundException(id);
}这是一个 crud 个人项目。我对 post 方法也有同样的疑问。
有了正确定义的类和关系,您可以简单地使用第二种方法,它干净且易于理解。
通过正确的关系定义,我的意思是类之间的映射(无论它们是一对一还是一对多等)和它们的级联类型。在您的情况下,您可以使用CascadeType.ALL,它将父类上完成的所有数据库操作传播到子类。因此,当您保存父对象时,您的子对象也会被保存。即使您的子类不存在于数据库中,它也会为您创建一个。
现在,您的第一种方法也适用于少数情况。例如,假设您正在发送包含一些城市数据的请求,其中对于给定的 ID,提供的名称与数据库中的名称不同。因此,对于您的方法,您不会更新数据库中的不同名称,而是从数据库中获取实际数据并进行设置。但如果您遵循第二种方法,它将覆盖城市名称的现有数据。
要克服第二种方法中的问题,您可以将级联更改为CascadeType.PERSIST,这只会将保存操作传播到子类,而不是更新或删除操作。
以上就是我应该为每个属性创建更新函数,还是应该允许部分更新?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号