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。
推薦閱讀:
- 解決使用@ManyToMany查詢數據時的死循環問題
- SpringBoot如何使用ApplicationContext獲取bean對象
- Spring Boot 整合JPA 數據模型關聯使用操作(一對一、一對多、多對多)
- SpringBoot + JPA @ManyToMany的操作要點說明
- 使用JPA雙向多對多關聯關系@ManyToMany