0

0

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

WBOY

WBOY

发布时间:2024-02-05 21:33:07

|

1205人浏览过

|

来源于stackoverflow

转载

问题内容

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

第一个示例

@transactional
    @override
    public teamdto updateteambyid(long id, teamdto teamdto) throws apiexception {
        optional 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);
    }

第二个示例

sematic
sematic

一个开源的机器学习平台

下载
@Transactional
    @Override
    public TeamDTO updateTeamById(Long id, TeamDTO teamDTO) throws ApiException {
        Team team = teamMapper.teamDTOToTeam(teamDTO);
        Optional 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,这只会将保存操作传播到子类,而不是更新或删除操作。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

330

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2068

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

346

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

251

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

319

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

402

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

368

2023.10.16

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

217

2023.10.19

vlookup函数使用大全
vlookup函数使用大全

本专题整合了vlookup函数相关 教程,阅读专题下面的文章了解更多详细内容。

28

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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