springboot+spring?data?jpa實(shí)現(xiàn)新增及批量新增方式
springboot+spring data jpa實(shí)現(xiàn)新增及批量新增
spring data jpa (以下簡(jiǎn)稱jpa)。這個(gè)orm其實(shí)和mybatis還是差不多的。但是相對(duì)于mybatis來(lái)說,省去很多方法,畢竟jpa來(lái)說,官方文檔給的說法是編寫者只需要書寫接口。剩下的事就交由jpa來(lái)完成。當(dāng)時(shí),灑家還是不信的。當(dāng)你用過一次后,你就會(huì)發(fā)現(xiàn)。真的是這樣。只能用兩個(gè)字來(lái)形容,即是“真香”。
好了,廢話不多說了。今天貼的代碼不包含基礎(chǔ)配置哈。。
實(shí)體類如下:
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層:
其實(shí),具體的單條數(shù)據(jù)添加還是看個(gè)人的業(yè)務(wù)邏輯而說,每個(gè)人想法不一樣,寫的代碼方式也不一樣。如您有更好的寫法。也可以貼出來(lái),大家一起進(jìn)步。
說完單條,該說批量了
用的實(shí)體類都是一樣的
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 { //批量存儲(chǔ)的集合 List<SysAdminUser> data = new ArrayList<SysAdminUser>(); //批量存儲(chǔ) for (SysAdminUser s : list) { if(data.size() == listsize/10) { demoService.save(data); data.clear(); } data.add(s); } //將剩下的數(shù)據(jù)也導(dǎo)入 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); }
因?yàn)樵趕ervice層的時(shí)候,它其實(shí)也調(diào)的是jpa里面自帶的方法。
而repository層的代碼也是單純的一個(gè)接口罷了
如下:
springdatajpa 新增操作注意
org.hibernate.PersistentObjectException: detached entity passed to persist異常
簡(jiǎn)單地來(lái)看,將一個(gè)游離的對(duì)象要被持久化(save)時(shí)報(bào)錯(cuò)。
我們知道要持久化對(duì)象時(shí)候,通常Hibernate會(huì)根據(jù)ID生成策略自動(dòng)生成ID值,但是這個(gè)對(duì)象ID已經(jīng)有值,所有拋錯(cuò)。
這個(gè)錯(cuò)誤是我在配置如下1一對(duì)多@OneToMany的關(guān)聯(lián)關(guān)系時(shí)報(bào)的錯(cuò)。
@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<>();
因?yàn)榧?jí)聯(lián)關(guān)系是CascadeType.ALL,所以save時(shí)會(huì)保存級(jí)聯(lián)的對(duì)象Role,但是Role已經(jīng)存在,因此就報(bào)錯(cuò)了。
將cascade改為CascadeType.MERGE或者CascadeType.REFRESH即可,表示級(jí)聯(lián)對(duì)象在Role表存在則進(jìn)行update操作,而不做save操作。級(jí)聯(lián)操作時(shí)謹(jǐn)慎用CascadeType.ALL
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis?在?insert?插入操作后返回主鍵?id的操作方法
這篇文章主要介紹了Mybatis?在?insert?插入操作后返回主鍵?id的操作方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12Java通過值查找對(duì)應(yīng)的枚舉的實(shí)現(xiàn)
本文主要介紹了Java通過值查找對(duì)應(yīng)的枚舉的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解
這篇文章主要為大家介紹了最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09如何使用IDEA的groovy腳本文件生成帶JPA注解的實(shí)體類(圖文詳解)
這篇文章主要介紹了如何使用IDEA的groovy腳本文件生成帶JPA注解的實(shí)體類,本文通過圖文并茂實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07詳解Spring 兩種注入的方式(Set和構(gòu)造)實(shí)例
本篇文章主要介紹了Spring 兩種注入的方式(Set和構(gòu)造)實(shí)例,Spring框架主要提供了Set注入和構(gòu)造注入兩種依賴注入方式。有興趣的可以了解一下。2017-02-02Spring中@EnableScheduling實(shí)現(xiàn)定時(shí)任務(wù)代碼實(shí)例
這篇文章主要介紹了Spring中@EnableScheduling實(shí)現(xiàn)定時(shí)任務(wù)代碼實(shí)例,@EnableScheduling 注解開啟定時(shí)任務(wù)功能,可以將多個(gè)方法寫在一個(gè)類,也可以分多個(gè)類寫,當(dāng)然也可以將方法直接寫在上面ScheddulConfig類中,需要的朋友可以參考下2024-01-01