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

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

禪工作室 13.0.1
強大的PHP整合開發環境

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver CS6
視覺化網頁開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。