首页 > Java > 正文

我应该为每个属性创建更新函数,还是应该允许部分更新?

WBOY
发布: 2024-02-05 21:33:07
转载
1158人浏览过
问题内容

更新过程应该如何实施?是否建议对所有属性进行强制更新(第一个示例),或者我应该添加空检查条件以允许部分更新(第二个示例)?

第一个示例

@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中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
相关标签:
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号