springboot+spring data jpa實現新增及批量新增方式

springboot+spring data jpa實現新增及批量新增

spring data jpa (以下簡稱jpa)。這個orm其實和mybatis還是差不多的。但是相對於mybatis來說,省去很多方法,畢竟jpa來說,官方文檔給的說法是編寫者隻需要書寫接口。剩下的事就交由jpa來完成。當時,灑傢還是不信的。當你用過一次後,你就會發現。真的是這樣。隻能用兩個字來形容,即是“真香”。

好瞭,廢話不多說瞭。今天貼的代碼不包含基礎配置哈。。

實體類如下:

在這裡插入圖片描述

controller層:

@PostMapping(value = "/add")
    @ApiOperation(value = "新增功能", notes = "新增功能")
    public ResultVo<?> addInfo(@RequestBody @Valid SysAdminUser adminUser){
        return  demoService.addInfo(adminUser);
    }

在這裡插入圖片描述

service層:

public  ResultVo<?> addInfo(SysAdminUser adminUser){
        SysAdminUser sysAdminUser = modelMapper.map(adminUser, SysAdminUser.class);
        demoRepository.save(sysAdminUser);
        return ResultVo.success();
    }

repository層:

在這裡插入圖片描述

其實,具體的單條數據添加還是看個人的業務邏輯而說,每個人想法不一樣,寫的代碼方式也不一樣。如您有更好的寫法。也可以貼出來,大傢一起進步。

說完單條,該說批量瞭

用的實體類都是一樣的

controller層:

 @PostMapping(value = "/batch/add")
      @ApiOperation(value = "新增功能", notes = "批量新增")
          public Map<String,Object> addListModelParams(@RequestBody List<SysAdminUser> list) {
          int listsize = list.size();
          Map<String,Object> resultMap = new HashMap<>();
          if (listsize == 0) {
              throw new RuntimeException("集合為空!") ;
          } else {
              //批量存儲的集合
              List<SysAdminUser> data = new ArrayList<SysAdminUser>();
              //批量存儲
              for (SysAdminUser s : list) {
                  if(data.size() == listsize/10) {
                      demoService.save(data);
                      data.clear();
                  }
                  data.add(s);
              }
              //將剩下的數據也導入
              if(!data.isEmpty()) {
                  demoService.save(data);
                  resultMap.put("code", "0000");
                  resultMap.put("message", "批量添加成功");
              }
          }
          return resultMap;
      }

service層:

public void   save(List<SysAdminUser> list) {
        demoRepository.saveAll(list);
    }

因為在service層的時候,它其實也調的是jpa裡面自帶的方法。

而repository層的代碼也是單純的一個接口罷瞭

如下:

在這裡插入圖片描述

springdatajpa 新增操作註意

org.hibernate.PersistentObjectException: detached entity passed to persist異常

簡單地來看,將一個遊離的對象要被持久化(save)時報錯。

我們知道要持久化對象時候,通常Hibernate會根據ID生成策略自動生成ID值,但是這個對象ID已經有值,所有拋錯。

這個錯誤是我在配置如下1一對多@OneToMany的關聯關系時報的錯。

@OneToMany(targetEntity = Role.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinTable(name = "sys_user_role", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id", unique = true)) 
private Set<Role> roles = new HashSet<>(); 

因為級聯關系是CascadeType.ALL,所以save時會保存級聯的對象Role,但是Role已經存在,因此就報錯瞭。

將cascade改為CascadeType.MERGE或者CascadeType.REFRESH即可,表示級聯對象在Role表存在則進行update操作,而不做save操作。級聯操作時謹慎用CascadeType.ALL

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: