1. 程式人生 > >javax.persistence.RollbackException: Transaction marked as rollbackOnly異常出現的原因以及避免方法

javax.persistence.RollbackException: Transaction marked as rollbackOnly異常出現的原因以及避免方法

這次的需求是實現匯入功能,要求:如果匯入的內容以及存在,那就以excel表格的形式反饋給使用者,並且告知使用者每一行的錯誤原因;如果該條記錄資料庫中不存在,那麼就新增到資料庫中。

一開始,我的思路是在執行save操作時用try-catch包圍,如果catch到了異常,那麼就將這個對像放到errors中,在最後將errors匯出成excel。

但是問題來了,由於我的repository是繼承自JPARepository的,並且為了提高插入的效率,在service中加了@Transactional(noRollbackFor = Exception.class)註解。正是因為加了這個註解,所以導致了javax.persistence.RollbackException: Transaction marked as rollbackOnly異常的發生。

下面先來舉個小列子

@Transactional(noRollbackFor = Exception.class)

Public void A(){

for(int 1=0;i<10;i++)

try{

add(i);

}catch(Exception e){

輸出(i);

}

}

@Transactional

Public void add(int i){

if(i>5)

   Throw a exception//假設丟擲一個異常

將 i 插入到資料庫中

}

在這種情況下就會出現javax.persistence.RollbackException: Transaction marked as rollbackOnly異常。

當在A方法中執行B方法時,雖然A方法加了 noRollbackFor = Exception.class ,但是由於呼叫的B方法沒有加,並且在B中丟擲了異常,那麼就會報這個錯誤,也無法達到我的目的,即插入0到5這幾個數字,而是會全部回滾。

我的需求跟這個類似,我本來想通過try-catch來捕捉到插入失敗的物件,然後分析異常原因,再匯出給使用者,好讓他們修改完之後再上傳。但是我呼叫Jpa的sava方法,它本身的實現中就加了@Transactional,沒有加noRollbackFor = Exception.class,因此即便我在service方法中加了@Transactional(noRollbackFor = Exception.class),也會回滾。

下面我的解決方法是進行預處理,在插入之前先進行判重,即將考試表中的考題拿出來,為了提高判重效率,先將String的考題構建Hash值,然後進行比較,這樣的比較速度會大大提高。程式碼如下

@Transactional
    public Map<String, Object> save(List<Exam> exams) {
        Map<String, Object> error = new HashMap<>();

        List<Exam> errors = new ArrayList<>();
        List<String> errorMsgs = new ArrayList<>();

        List<String> tests = repo.findTests();

        List<Integer> testHashcodes = new ArrayList<Integer>();
        for (String test : tests) {
            testHashcodes.add(test.hashCode());
        }

        int hashcode = -1;
        for (Exam exam : exams) {
            hashcode = exam.getTest().hashCode();
            if (testHashcodes.contains(hashcode)) {
                errors.add(exam);
                errorMsgs.add("題目重複");
            } else {
                repo.save(exam);
                testHashcodes.add(hashcode);
            }
        }
        error.put("errors", errors);
        error.put("errormsg", errorMsgs);

        return error;
    }


相關推薦

javax.persistence.RollbackException: Transaction marked as rollbackOnly異常出現原因以及避免方法

這次的需求是實現匯入功能,要求:如果匯入的內容以及存在,那就以excel表格的形式反饋給使用者,並且告知使用者每一行的錯誤原因;如果該條記錄資料庫中不存在,那麼就新增到資料庫中。 一開始,我的思路是在執行save操作時用try-catch包圍,如果catch到了異常,那麼就

使用JPA保存對象時報nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly錯誤

exce ack exceptio jpa 實現 style 結果 enc 字段 使用JPA保存對象時報nested exception is javax.persistence.RollbackException: Transaction marked as rollba

easyUI datagrid 多行多列數據渲染異常緩慢原因以及解決方法

後端 http 前後端 公司 發送請求 class 之前 vue 做的 原因 最近,在優化之前公司幫聯想(外包)做的一個老的後臺管理系統,由於項目是基於easy UI框架,頁面是後臺用jsp實現的,再加上在公司推行前後端分離的實踐,大部分項目都基於vue采用前後端分離去實現

spring事務(Transaction )報 marked as rollback-only異常原因及解決方法

很多朋友在使用spring+hibernate或mybatis等框架時經常遇到報Transaction rolled back because it has been marked as rollback-only的異常,這個異常是怎麼造成的 呢,下面將給大家進行詳細的分析。 &nbs

Spring-Boot 出現Transaction marked as rollback only異常

最近在開發的過程中遇到了使用Transaction marked as rollback only的問題,瞭解到報錯的原因: 應該是事務被rollback了多次導致的錯誤。仔細看程式碼,由於專案中在aop切面、控制層、service分別開啟了一次事務,而

Transaction marked as rollback-only異常

1、當整個方法中每個子方法沒報錯時,整個方法執行完才提交事務,如果某個子方法有異常,spring將該事務標

ssm整合時出現 org.springframework.beans.factory.BeanCreationException :Error creating bean with name ‘XXX’ 異常原因及解決方法

ase wan oca conn sna aspect ava 配置 ng- ssm整合時出現 org.springframework.beans.factory.BeanCreationException :Error creating bean with name ‘X

ConcurrentModificationException: 集合異常——產生原因和解決方法

:注意事項:迭代器在使用的時候,有人為了方便,如下使用就會有問題 System.out.println(((Student)it.next()).getName()+”---”+((Student)it.next()).getAge()); 注意事項:迭代器在使用的時候,有人為了方便,如下使

【夾娃系列】java面試基礎知識儲備(¥2)——JVM記憶體劃分和記憶體溢位異常原因和解決方法

JVM記憶體劃分和記憶體溢位 JVM記憶體劃分 記憶體溢位的異常和解決辦法 JVM記憶體劃分 堆:存放物件例項,被所有的執行緒共享的一塊區域。垃圾收集器管理的主要區域。 方法區:儲存虛擬機器載入的類資訊,常量,靜態變

socket is closed異常原因及其解決方法

在一個有關socket的程式中,客戶端出現了 socket is closed異常,我百思不得其解,並沒有關閉socket啊。 下面首先來分析一下這個異常出現的原因:該異常在客戶端和伺服器均可能發生。異常的原因是己方主動關閉了連線後(呼叫了Socket的clo

出現 org.springframework.beans.factory.BeanCreationException 異常原因及解決方法

1 異常描述 在從 SVN 檢出專案並配置完成後,啟動 Tomcat 伺服器,報出如下錯誤: 2 異常原因 通過觀察上圖中被標記出來的異常資訊,咱們可以知道 org.springframework.beans.factory.BeanCre

ClassCastException異常出現原因和解決方法

ClassCastException是JVM在檢測到兩個型別間轉換不相容時引發的執行時異常。此類錯誤通常會終止使用者請求。在執行任何子系統的應用程式程式碼時都有可能發生ClassCastException異常。通過轉換,可以指示Java編譯器將給定型別的變數作為

出現 org.apache.ibatis.binding.BindingException 異常原因及解決方法

1 異常描述 在對資料庫表中現有敏感資訊(例如姓名、手機號、身份證號、銀行卡號等)進行加密處理的時候,報出如下錯誤: 2 異常分析 通過觀察上圖中被標記出來的異常資訊,我們可以知道 org.apache.ibatis.binding.Bindi

出現 java.net.ConnectException: Connection refused 異常原因及解決方法

1 異常描述在啟動 Tomcat 伺服器的時候,控制檯一直輸出異常資訊,然後停止伺服器,報出如下異常:2 異常原因通過觀察上圖中被標記出來的異常資訊,咱們可以知道java.net.ConnectException: Connection refused此異常,為:連線被拒絕異

使用getSessionFactory().getCurrentSession()獲取session出現異常原因及解決方法

出問題的地方:具體異常:org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current threadat org.springframework.o

驗證碼 getOutputStream() has already been called for this response異常原因和解決方法

1.tomcat5下jsp出現getOutputStream() has already been called for this response異常的原因和解決方法在tomcat5下jsp中出現此錯誤一般都是在jsp中使用了輸出流(如輸出圖片驗證碼,檔案下載等),沒有妥善處理好的原因。 具體的原因就是在

Transaction rolled back because it has been marked as rollback-only

解決辦法 框架 捕獲 back 結束 tro 接口 lba -o 出現這種錯誤的原因 1.接口A 調用了接口B 2.接口B報異常了,沒有在B裏面進行try catch捕獲 3.接口A對 接口B進行了try catch捕獲 因為接口B報異常 會把當前事物A接口的事物(如果B沒

Transaction rolled back because it has been marked as rollback-only分析解決方法

1. Transaction rolled back because it has been marked as rollback-only事務已回滾,因為它被標記成了只回滾<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>q

Hibernate異常:NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/

在進行JUnit4測試時,拋異常: Caused by: java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey; at org.

No qualifying bean of type [javax.persistence.EntityManage] 異常問題的解決

引言: 在Spring Web專案中一般都會使用OpenEntityManagerInViewFilter來保證JPA session的正常關閉,在筆者的專案中,使用了Spring + Spring Data + JPA + Hibernate來的架構來組織專案,碰到了or