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

网友投稿 1089 2022-11-20

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

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

目录springboot+spring data jpa实现新增及批量新增springdatajpa 新增操作注意

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&lOhaGSdFJt;?> 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 addListModelParams(@RequestBody List list) {

int listsize = list.size();

Map resultMap = new HashMap<>();

if (listsize == 0) {

throw new RuntimeException("集合为空!") ;

} else {

//批量存储的集合

List data = new ArrayList();

//批量存储

for (SysAdminUser s : list) {

if(data.size() == listsize/10) {

demoService.save(data);

data.cOhaGSdFJlear();

}

data.add(s);

}

//将剩下的数据也导入

if(!data.isEmpty()) {

dhttp://emoService.save(data);

resultMap.put("code", "0000");

resultMap.put("message", "批量添加成功");

}

}

return resultMap;

}

service层:

public void save(List list) {

demoRepository.saOhaGSdFJveAll(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 roles = new HashSet<>();

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

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:PHP系列之正则表达式在PHP里的应用
下一篇:svn系列之VisualSVN搭建svn代码服务器
相关文章

 发表评论

暂时没有评论,来抢沙发吧~