zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    操作系统作业调度-操作系统
    评论--软件工程
    实验二 作业调度模拟程序
    复利计算评价博客
    构建之法(第四章读后感)
    复利计算--结对项目<04-11-2016> 1.0.0 lastest 阶段性完工~
    实验一 命令解释程序的编写
    构建之法(前三章读后感)
    实验0 了解和熟悉操作系统(操作系统)
    Scrum项目4.0
  • 原文地址:https://www.cnblogs.com/leotsai/p/hibernate-save.html
Copyright © 2011-2022 走看看