目錄
我應該為每個屬性建立更新函數,還是應該允許部分更新?
問題內容
更新流程應該如何實作?是否建議對所有屬性進行強制更新(第一個範例),或者我應該添加空檢查條件以允許部分更新(第二個範例)?
第一個範例
#@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中文網其他相關文章!
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前
By 尊渡假赌尊渡假赌尊渡假赌
刺客信條陰影:貝殼謎語解決方案
3 週前
By DDD
Windows 11 KB5054979中的新功能以及如何解決更新問題
2 週前
By DDD
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前
By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

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

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
