Maison  >  Article  >  Dois-je créer une fonction de mise à jour pour chaque propriété ou dois-je autoriser des mises à jour partielles ?

Dois-je créer une fonction de mise à jour pour chaque propriété ou dois-je autoriser des mises à jour partielles ?

WBOY
WBOYavant
2024-02-05 21:33:071167parcourir
Contenu de la question

Comment le processus de mise à jour doit-il être mis en œuvre ? Est-il recommandé de faire une mise à jour forcée de toutes les propriétés (premier exemple) ou dois-je ajouter une condition de vérification nulle pour autoriser les mises à jour partielles (deuxième exemple) ?

Premier exemple

@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);
    }

Deuxième exemple

@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);
    }

C'est un projet personnel grossier. J'ai la même question sur la méthode post.


Bonne réponse


Avec des classes et des relations correctement définies, vous pouvez simplement utiliser la Deuxième méthode, qui est claire et facile à comprendre.

Par définition appropriée des relations, j'entends la cartographie entre classes (qu'elles soient individuelles ou un-à-plusieurs, etc.) et leurs types de cascade . Dans votre cas, vous pouvez utiliser CascadeType.ALL qui propagera toutes les opérations de base de données effectuées sur la classe parent à la classe enfant. Ainsi, lorsque vous enregistrez l'objet parent, vos objets enfants sont également enregistrés. Même si votre sous-classe n'existe pas dans la base de données, elle en créera une pour vous.

Désormais, votre première approche fonctionne également dans quelques cas. Par exemple, supposons que vous envoyiez une requête contenant des données de ville, où pour un identifiant donné, le nom fourni est différent du nom dans la base de données. Donc, pour votre approche, vous ne mettez pas à jour les différents noms dans la base de données, mais vous récupérez les données réelles de la base de données et les définissez. Mais si vous suivez la deuxième méthode, elle écrasera les données existantes du nom de la ville.
Pour surmonter les problèmes de la deuxième approche, vous pouvez modifier la cascade en CascadeType.PERSIST, qui propagera uniquement les opérations de sauvegarde aux sous-classes, pas les opérations de mise à jour ou de suppression.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer