经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
springboot+spring?data?jpa实现新增及批量新增方式
来源:jb51  时间:2021/11/23 12:53:10  对本文有异议

springboot+spring data jpa实现新增及批量新增

spring data jpa (以下简称jpa)。这个orm其实和mybatis还是差不多的。但是相对于mybatis来说,省去很多方法,毕竟jpa来说,官方文档给的说法是编写者只需要书写接口。剩下的事就交由jpa来完成。当时,洒家还是不信的。当你用过一次后,你就会发现。真的是这样。只能用两个字来形容,即是“真香”。

好了,废话不多说了。今天贴的代码不包含基础配置哈。。

实体类如下:

在这里插入图片描述

controller层:

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

在这里插入图片描述

service层:

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

repository层:

在这里插入图片描述

其实,具体的单条数据添加还是看个人的业务逻辑而说,每个人想法不一样,写的代码方式也不一样。如您有更好的写法。也可以贴出来,大家一起进步。

说完单条,该说批量了

用的实体类都是一样的

controller层:

  1. @PostMapping(value = "/batch/add")
  2. @ApiOperation(value = "新增功能", notes = "批量新增")
  3. public Map<String,Object> addListModelParams(@RequestBody List<SysAdminUser> list) {
  4. int listsize = list.size();
  5. Map<String,Object> resultMap = new HashMap<>();
  6. if (listsize == 0) {
  7. throw new RuntimeException("集合为空!") ;
  8. } else {
  9. //批量存储的集合
  10. List<SysAdminUser> data = new ArrayList<SysAdminUser>();
  11. //批量存储
  12. for (SysAdminUser s : list) {
  13. if(data.size() == listsize/10) {
  14. demoService.save(data);
  15. data.clear();
  16. }
  17. data.add(s);
  18. }
  19. //将剩下的数据也导入
  20. if(!data.isEmpty()) {
  21. demoService.save(data);
  22. resultMap.put("code", "0000");
  23. resultMap.put("message", "批量添加成功");
  24. }
  25. }
  26. return resultMap;
  27. }

service层:

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

因为在service层的时候,它其实也调的是jpa里面自带的方法。

而repository层的代码也是单纯的一个接口罢了

如下:

在这里插入图片描述

springdatajpa 新增操作注意

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

简单地来看,将一个游离的对象要被持久化(save)时报错。

我们知道要持久化对象时候,通常Hibernate会根据ID生成策略自动生成ID值,但是这个对象ID已经有值,所有抛错。

这个错误是我在配置如下1一对多@OneToMany的关联关系时报的错。

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

因为级联关系是CascadeType.ALL,所以save时会保存级联的对象Role,但是Role已经存在,因此就报错了。

将cascade改为CascadeType.MERGE或者CascadeType.REFRESH即可,表示级联对象在Role表存在则进行update操作,而不做save操作。级联操作时谨慎用CascadeType.ALL

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号