首頁 > Java > 主體

我應該為每個屬性建立更新函數,還是應該允許部分更新?

WBOY
發布: 2024-02-05 21:33:07
轉載
1394 人瀏覽過
問題內容

更新流程應該如何實作?是否建議對所有屬性進行強制更新(第一個範例),或者我應該添加空檢查條件以允許部分更新(第二個範例)?

第一個範例

#
@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中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板