更新流程應該如何實作?是否建議對所有屬性進行強制更新(第一個範例),或者我應該添加空檢查條件以允許部分更新(第二個範例)?
第一個範例
#@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中文網其他相關文章!