电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

基于Spring Boot使用JpaRepository刪除數(shù)據(jù)時(shí)的注意事項(xiàng)

瀏覽:8日期:2023-07-11 15:15:46
問(wèn)題:

在Spring Boot中使用JpaRepository的deleteById(ID id)方法刪除數(shù)據(jù)時(shí),首先要使用existsById(ID id)方法判斷數(shù)據(jù)是否存在。如果存在,再刪除。

否則,刪除一個(gè)id不存在的數(shù)據(jù)會(huì)拋出org.springframework.dao.EmptyResultDataAccessException異常:

2019-01-02 15:57:24.122 WARN org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration$JpaWebConfiguration$JpaWebMvcConfiguration Line:234 - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning2019-01-02 15:57:24.673 ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] Line:175 - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.EmptyResultDataAccessException: No class com.qiqi.model.entity.UserBean entity with id 33 exists!] with root causeorg.springframework.dao.EmptyResultDataAccessException: No class com.qiqi.model.entity.UserBean entity with id 33 exists! at org.springframework.data.jpa.repository.support.SimpleJpaRepository.lambda$deleteById$0(SimpleJpaRepository.java:150) at org.springframework.data.jpa.repository.support.SimpleJpaRepository$$Lambda$798/1206249587.get(Unknown Source) at java.util.Optional.orElseThrow(Optional.java:290) at org.springframework.data.jpa.repository.support.SimpleJpaRepository.deleteById(SimpleJpaRepository.java:149) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:359) at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:200) at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:644) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:608) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$invoke$3(RepositoryFactorySupport.java:595) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor$$Lambda$787/1363172555.get(Unknown Source) at org.springframework.data.repository.util.QueryExecutionConverters$$Lambda$786/1029051888.apply(Unknown Source) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:595) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)

在使用其他方法時(shí),例如:deleteAllByName(name),不進(jìn)行判斷也可以刪除,不會(huì)拋出異常。

springboot的jpa數(shù)據(jù)庫(kù)操作的坑

前一段用springboot寫了篇 springboot整合多數(shù)據(jù)源小博文,從三個(gè)數(shù)據(jù)庫(kù)里面抓取合適的數(shù)據(jù)。存在另外一個(gè)數(shù)據(jù)庫(kù)里面。在客戶生產(chǎn)環(huán)境運(yùn)行了一段時(shí)間,感覺(jué)似乎很良好。

客戶覺(jué)得意猶未盡,又提了點(diǎn)需求,順便提了點(diǎn)bug,于是乎又改了改代碼。客戶居然提出一個(gè)問(wèn)題,說(shuō)有時(shí)候查不出數(shù)據(jù)來(lái),過(guò)一會(huì)又好了,我在本地試了試,發(fā)現(xiàn)在本地竟然也存在這個(gè)問(wèn)題。問(wèn)題其實(shí)一直都有,只是似乎不影響什么,所以便沒(méi)當(dāng)一回事。

經(jīng)過(guò)反復(fù)測(cè)試,原來(lái)是往數(shù)據(jù)庫(kù)寫數(shù)據(jù)的時(shí)候卡住了,有點(diǎn)奇怪。大概過(guò)程是先把表里面數(shù)據(jù)清除,然后再寫入,數(shù)據(jù)不到1000條,居然耗時(shí)差不多10秒,什么springboot,什么jpa太不靠譜了吧?

看代碼 ,Repository

package net.springboot.repository.sqlserver;import java.util.List;import org.springframework.data.jpa.repository.JpaRepository;import net.springboot.entity.sqlserver.RealData;public interface XXDataRepository extends JpaRepository<XXData, String>{}

調(diào)用代碼也是簡(jiǎn)單明了

db.deleteAll();db.saveAll(list); //組合list這里就不寫了

其實(shí)說(shuō)白了,沒(méi)有自己的代碼,都是springboot + jpa 框架實(shí)現(xiàn)的,框架難道有問(wèn)題,這個(gè)一般不會(huì)吧。把SQL放出來(lái)看看。

基于Spring Boot使用JpaRepository刪除數(shù)據(jù)時(shí)的注意事項(xiàng)

基于Spring Boot使用JpaRepository刪除數(shù)據(jù)時(shí)的注意事項(xiàng)

原來(lái)這個(gè)樣子,刪除全表數(shù)據(jù),居然是一條一條數(shù)據(jù)刪除,批量保存居然是先查詢一下,然后再插入,JPA難道不考慮效率的嗎?

問(wèn)題找到了,怎么解決了?刪除功能好辦,自己寫SQL嘛,簡(jiǎn)單方便,翠花上川菜,代碼拿來(lái)。

@Transactional@Modifying@Query(value = 'TRUNCATE TABLE table',nativeQuery = true)int TruncateTable();@Transactional@Modifying@Query(value = 'delete from table',nativeQuery = true)int deleteTable();

效果是立竿見(jiàn)影,刪除效率上來(lái)了。清空表里數(shù)據(jù)一秒不到。不過(guò),后來(lái)又仔細(xì)看了一下,jpa似乎還提供了另外一個(gè)刪除全部數(shù)據(jù)的方法 deleteAllInBatch,這個(gè)方法在刪除前似乎沒(méi)有查詢,懶得做測(cè)試了,習(xí)慣了自己寫SQL解決問(wèn)題。

但是批量插入這個(gè)不好辦了,總不可能自己寫成一條一條插入啊,那還不如不改了。百度一下,網(wǎng)上說(shuō)改一下配置文件即可。

spring.jpa.properties.hibernate.jdbc.batch_size=500spring.jpa.properties.hibernate.jdbc.batch_versioned_data=truespring.jpa.properties.hibernate.order_inserts=truespring.jpa.properties.hibernate.order_updates=true

但是好像效果不行,show sql 還是一樣,先查詢后插入,效率依然不行。想了很多,百度了很多,為什么了,為什么?。縅PA這玩意為什么會(huì)在插入前查詢一下了,查詢又是怎么個(gè)查詢方式了?這個(gè)應(yīng)該與主鍵ID有關(guān)系。所以改一下實(shí)體類,id統(tǒng)一為uuid模式。

@Id @GenericGenerator(name = 'id-generator', strategy = 'uuid') @GeneratedValue(generator = 'id-generator') @Column(name = 'pid') public String pid;

效果明顯,問(wèn)題立馬解決。但是有的系統(tǒng)主鍵ID是生成好的,有自己的規(guī)則,不可以隨便uuid,比如我這個(gè)系統(tǒng)就是,都是在各個(gè)系統(tǒng)里面已經(jīng)生成好了,而且還因?yàn)闃I(yè)務(wù)需要不能改。

沒(méi)辦法只有另加一個(gè)字段做為@id 雖然沒(méi)啥實(shí)際意義,但是批量寫入數(shù)據(jù)的問(wèn)題得到徹底解決,你好,我好,大家好。

不過(guò)話說(shuō)回來(lái),插入前查詢一下,這個(gè)功能是可以有,在大多數(shù)的業(yè)務(wù)場(chǎng)景也是很有用的。springboot的jpa就這樣,在系統(tǒng)中,具體怎么用,碼農(nóng)們各顯神通。

也算是趟過(guò) springboot,jpa框架的兩個(gè)坑。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 驾驶式洗地机/扫地机_全自动洗地机_工业洗地机_荣事达工厂官网 | 国际高中-国际学校-一站式择校服务-远播国际教育| 净化车间_洁净厂房_净化公司_净化厂房_无尘室工程_洁净工程装修|改造|施工-深圳净化公司 | 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | 洁净化验室净化工程_成都实验室装修设计施工_四川华锐净化公司 | 艺术生文化课培训|艺术生文化课辅导冲刺-济南启迪学校 | 影像测量仪_三坐标测量机_一键式二次元_全自动影像测量仪-广东妙机精密科技股份有限公司 | 排烟防火阀-消防排烟风机-正压送风口-厂家-价格-哪家好-德州鑫港旺通风设备有限公司 | 气弹簧定制-气动杆-可控气弹簧-不锈钢阻尼器-工业气弹簧-可调节气弹簧厂家-常州巨腾气弹簧供应商 | 西门子伺服电机维修,西门子电源模块维修,西门子驱动模块维修-上海渠利 | 粘度计,数显粘度计,指针旋转粘度计 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | cnc精密加工_数控机械加工_非标平键定制生产厂家_扬州沃佳机械有限公司 | 杭州用友|用友软件|用友财务软件|用友ERP系统--杭州协友软件官网 | 吉林污水处理公司,长春工业污水处理设备,净水设备-长春易洁环保科技有限公司 | PCB接线端子_栅板式端子_线路板连接器_端子排生产厂家-置恒电气 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 二氧化碳/活性炭投加系统,次氯酸钠发生器,紫外线消毒设备|广州新奥 | 长沙印刷厂-包装印刷-画册印刷厂家-湖南省日大彩色印务有限公司 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 | 懂研帝_专业SCI论文润色机构_SCI投稿发表服务公司 | 金属切削液-脱水防锈油-电火花机油-抗磨液压油-深圳市雨辰宏业科技发展有限公司 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 钢丝绳探伤仪-钢丝绳检测仪-钢丝绳探伤设备-洛阳泰斯特探伤技术有限公司 | 无缝钢管-聊城无缝钢管-小口径无缝钢管-大口径无缝钢管 - 聊城宽达钢管有限公司 | 工业淬火油烟净化器,北京油烟净化器厂家,热处理油烟净化器-北京众鑫百科 | 手机游戏_热门软件app下载_好玩的安卓游戏下载基地-吾爱下载站 | 氧化铁红厂家-淄博宗昂化工 | 团建-拓展-拓展培训-拓展训练-户外拓展训练基地[无锡劲途] | 无锡网站建设-做网站-建网站-网页设计制作-阿凡达建站公司 | 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 耐火砖厂家,异形耐火砖-山东瑞耐耐火材料厂 | 北京成考网-北京成人高考网 | 北京企业宣传片拍摄_公司宣传片制作-广告短视频制作_北京宣传片拍摄公司 | 水质传感器_水质监测站_雨量监测站_水文监测站-山东水境传感科技有限公司 |