亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2021年06月10日 14:35:28   作者:石頭成說(shuō)  
這篇文章主要介紹了Spring Boot使用JpaRepository刪除數(shù)據(jù)時(shí)的注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

問(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 warning
2019-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 cause
org.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寫(xiě)了篇 springboot整合多數(shù)據(jù)源小博文,從三個(gè)數(shù)據(jù)庫(kù)里面抓取合適的數(shù)據(jù)。存在另外一個(gè)數(shù)據(jù)庫(kù)里面。在客戶(hù)生產(chǎn)環(huán)境運(yùn)行了一段時(shí)間,感覺(jué)似乎很良好。

客戶(hù)覺(jué)得意猶未盡,又提了點(diǎn)需求,順便提了點(diǎn)bug,于是乎又改了改代碼??蛻?hù)居然提出一個(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ù)寫(xiě)數(shù)據(jù)的時(shí)候卡住了,有點(diǎn)奇怪。大概過(guò)程是先把表里面數(shù)據(jù)清除,然后再寫(xiě)入,數(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這里就不寫(xiě)了 

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

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

問(wèn)題找到了,怎么解決了?刪除功能好辦,自己寫(xiě)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)有查詢(xún),懶得做測(cè)試了,習(xí)慣了自己寫(xiě)SQL解決問(wèn)題。

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

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

但是好像效果不行,show sql 還是一樣,先查詢(xún)后插入,效率依然不行。想了很多,百度了很多,為什么了,為什么啊?JPA這玩意為什么會(huì)在插入前查詢(xún)一下了,查詢(xún)又是怎么個(gè)查詢(xún)方式了?這個(gè)應(yīng)該與主鍵ID有關(guān)系。所以改一下實(shí)體類(lèi),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í)際意義,但是批量寫(xiě)入數(shù)據(jù)的問(wèn)題得到徹底解決,你好,我好,大家好。

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

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java結(jié)合email實(shí)現(xiàn)自動(dòng)推送功能

    java結(jié)合email實(shí)現(xiàn)自動(dòng)推送功能

    這篇文章主要介紹了java結(jié)合email實(shí)現(xiàn)自動(dòng)推送功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot兩種方式刷新配置信息

    SpringBoot兩種方式刷新配置信息

    這篇文章主要介紹了SpringBoot兩種方式刷新配置信息,一種是@?ConfigurationProperties?不能自動(dòng)刷新,需要手動(dòng)調(diào)用contextRefresher.refresh()方法來(lái)刷新配置,第二種方法可以嘗試下,需要的朋友可以參考下
    2023-08-08
  • springboot 啟動(dòng)如何修改application.properties的參數(shù)

    springboot 啟動(dòng)如何修改application.properties的參數(shù)

    這篇文章主要介紹了springboot 啟動(dòng)如何修改application.properties的參數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java保留兩位小數(shù)的幾種寫(xiě)法總結(jié)

    Java保留兩位小數(shù)的幾種寫(xiě)法總結(jié)

    相信大家在平時(shí)做項(xiàng)目時(shí),可能會(huì)有這樣的業(yè)務(wù)需求: 頁(yè)面或界面上展示的數(shù)據(jù)保留小數(shù)點(diǎn)后兩位。 那么這篇文章小編就和大家分享了利用Java保留兩位小數(shù)的幾種寫(xiě)法,文章給出了詳細(xì)的示例代碼,對(duì)大家的學(xué)習(xí)和理解很有幫助,有需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。
    2016-11-11
  • redis redisson 限流器的實(shí)例(RRateLimiter)

    redis redisson 限流器的實(shí)例(RRateLimiter)

    這篇文章主要介紹了redis redisson 限流器的實(shí)例(RRateLimiter),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java老矣 尚能飯否?

    Java老矣 尚能飯否?

    Java老矣,尚能飯否?各類(lèi)編程語(yǔ)言橫空出世,紛戰(zhàn)不休,然而 TIOBE 的語(yǔ)言排行榜上,Java 卻露出了明顯的頹勢(shì)。這個(gè)老牌的語(yǔ)言,未來(lái)會(huì)是怎樣?
    2017-06-06
  • 電腦上安裝多個(gè)JDK版本時(shí)該如何自由切換(詳細(xì)圖文)

    電腦上安裝多個(gè)JDK版本時(shí)該如何自由切換(詳細(xì)圖文)

    我們?cè)趯W(xué)習(xí)的過(guò)程中經(jīng)常用到不同的jdk版本,那么如何在一臺(tái)電腦上同時(shí)安裝多個(gè)jdk版本并進(jìn)行切換呢,這篇文章主要給大家介紹了關(guān)于電腦上安裝多個(gè)JDK版本時(shí)該如何自由切換的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • Spring\SpringBoot配置連接數(shù)據(jù)庫(kù)的方法

    Spring\SpringBoot配置連接數(shù)據(jù)庫(kù)的方法

    最近在學(xué)習(xí)SpringBoot,第一步就是要配置數(shù)據(jù)庫(kù),本文詳細(xì)的介紹了Spring\SpringBoot配置連接數(shù)據(jù)庫(kù)的方法,有需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • SpringBoot通過(guò)自定義注解實(shí)現(xiàn)參數(shù)校驗(yàn)

    SpringBoot通過(guò)自定義注解實(shí)現(xiàn)參數(shù)校驗(yàn)

    實(shí)現(xiàn)參數(shù)校驗(yàn)說(shuō)實(shí)話(huà)方式還挺多,個(gè)人使用過(guò)直接在Controller代碼里面寫(xiě)、AOP+自定義注解、ConstraintValidator。本文主要和大家講的是ConstraintValidator實(shí)現(xiàn),感興趣的可以了解一下
    2022-12-12
  • MVC AOP面向切面編程簡(jiǎn)單介紹及實(shí)例

    MVC AOP面向切面編程簡(jiǎn)單介紹及實(shí)例

    這篇文章主要介紹了MVC AOP面向切面編程簡(jiǎn)單介紹及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2016-12-12

最新評(píng)論