• Hibernate 新增和更新 标准写法


    controller层:

    @RestPost("/save")
    public StandardJsonResult save(MyBanner banner) {
        return super.tryJson(() -> {
            banner.validateOnSave();
            this.service.save(banner);
        });
    }

    service 层:

    @Override
    public void save(MyBanner banner) {
        super.useTransaction(db -> {
            if (banner.isToCreate()) {
                db.save(banner);
            } else {
                MyBanner dbBanner = db.getBannerSet().get(banner.getId());
                dbBanner.updateByAdmin(banner);
                db.save(dbBanner);
            }
        });
    }

    注意1:更新的时候,从数据查出的实体应该命名为dbEntity,如上方代码中的“dbBanner”,从而区分该实体不是由前端传回来的,这一点特别重要!因为前端传回来的实体,禁止直接更新到数据库。

    注意2:尽量不要在service层写大量的setXXXProperty的代码,尽量将更新代码放到实体类,如上方的.updateByAdmin 方法。

    注意3:更新的时候,最后的db.save 一定是保存从dbEntity,而不是从前端传回来的entity。

    最最最重要的就是dbEntity的命名!!!更新的时候只能save dbEntity!!!

    重构案例1:

    错误的代码:

    @Override
    public void save(AdminAlbumSaveDto adminAlbumSaveDto) {
        super.useTransaction(db -> {
            if (Objects.isNull(adminAlbumSaveDto.getId())) {
                Album album = Album.saveByDto(adminAlbumSaveDto);
                db.getSession().save(album);
            } else {
                Album dbAlbum = db.getAlbumSet().get(adminAlbumSaveDto.getId());
                if (Objects.isNull(dbAlbum)) {
                    throw new KnownException("该图集不存在");
                }
                dbAlbum.updateByDto(adminAlbumSaveDto);
                db.getSession().update(dbAlbum);
            }
    
        });
    }

    重构后:

    @Override
    public void save(AdminAlbumSaveDto adminAlbumSaveDto) {
        Album entity = adminAlbumSaveDto.toEntity();
        super.useTransaction(db -> {
            if (entity.isToCreate()) {
                db.save(entity);
            } else {
                Album dbAlbum = db.getAlbumSet().getSingle(entity.getId());
                dbAlbum.updateByAdmin(entity);
                db.save(dbAlbum);
            }
        });
    }
    AdminAlbumSaveDto 类下面的方法:
    public Album toEntity(){
        Album album = new Album();
        album.setId(this.getId());
        album.setImageKeys(this.getImageKeys());
        album.setName(this.getName());
        album.setFeaturedOrder(this.getFeaturedOrder());
        album.setPublishedTime(this.getPublishedTime());
        return album;
    }
  • 相关阅读:
    Contains Duplicate III
    Contains Duplicate
    bitmap
    机器人的运动范围
    矩阵中的路径
    不要62
    牛顿迭代法求方程的根
    统计C语言合法字符
    迭代法求平方根
    欧几里德算法(求两个正整数的最大公约数)
  • 原文地址:https://www.cnblogs.com/leotsai/p/hibernate-save.html
Copyright © 2020-2023  润新知