springboot+spring?data?jpa實現(xiàn)新增及批量新增方式
springboot+spring data jpa實現(xiàn)新增及批量新增
spring data jpa (以下簡稱jpa)。這個orm其實和mybatis還是差不多的。但是相對于mybatis來說,省去很多方法,畢竟jpa來說,官方文檔給的說法是編寫者只需要書寫接口。剩下的事就交由jpa來完成。當(dāng)時,灑家還是不信的。當(dāng)你用過一次后,你就會發(fā)現(xiàn)。真的是這樣。只能用兩個字來形容,即是“真香”。
好了,廢話不多說了。今天貼的代碼不包含基礎(chǔ)配置哈。。
實體類如下:

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ù)據(jù)添加還是看個人的業(yè)務(wù)邏輯而說,每個人想法不一樣,寫的代碼方式也不一樣。如您有更好的寫法。也可以貼出來,大家一起進步。
說完單條,該說批量了
用的實體類都是一樣的
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);
}
//將剩下的數(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);
}
因為在service層的時候,它其實也調(diào)的是jpa里面自帶的方法。
而repository層的代碼也是單純的一個接口罷了
如下:

springdatajpa 新增操作注意
org.hibernate.PersistentObjectException: detached entity passed to persist異常
簡單地來看,將一個游離的對象要被持久化(save)時報錯。
我們知道要持久化對象時候,通常Hibernate會根據(jù)ID生成策略自動生成ID值,但是這個對象ID已經(jīng)有值,所有拋錯。
這個錯誤是我在配置如下1一對多@OneToMany的關(guān)聯(lián)關(guān)系時報的錯。
@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<>();
因為級聯(lián)關(guān)系是CascadeType.ALL,所以save時會保存級聯(lián)的對象Role,但是Role已經(jīng)存在,因此就報錯了。
將cascade改為CascadeType.MERGE或者CascadeType.REFRESH即可,表示級聯(lián)對象在Role表存在則進行update操作,而不做save操作。級聯(lián)操作時謹(jǐn)慎用CascadeType.ALL
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
教你如何把Eclipse創(chuàng)建的Web項目(非Maven)導(dǎo)入Idea
這篇文章主要介紹了教你如何把Eclipse創(chuàng)建的Web項目(非Maven)導(dǎo)入Idea,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
MyBatis-Plus 動態(tài)表名SQL解析器的實現(xiàn)
這篇文章主要介紹了MyBatis-Plus 動態(tài)表名SQL解析器的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
基于Java實現(xiàn)一個簡單的單詞本Android App的實踐
本文基于Java實現(xiàn)了一個簡單的單詞本安卓app,用的是SQLite數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01

