2013-06-01 60 views
1

我需要拒絕事務回滾一小段方法,我不知道該怎麼做,因爲在方法的其他部分我需要標準的行爲。休眠和Mysql,交易自動提交只是一個部分

這是我的春天,Hibernate配置:

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

我的類被聲明爲一個「@Transaction」標註在例外的情況下,打開事務和回退。 但是我需要在db上重要插入之後強制執行提交。這個怎麼做?

這是示例代碼:

@Transactional 
public void myMethod(Object obj){ 
    check.do(); 
    check.control(); 
    try{ 
     dao.insert(obj); 
     fileWriter.write(); 
     printer.print(); 
    }catch(Exception e){ 
     log.error(e); 
    } 
} 

我try語句(dao.insert)裏面做什麼一定要在自動提交,因爲我不希望這樣在插入之後的東西回滾事務做。在我的例子中,如果printer.print()失敗,我不希望dao.insert()回滾。不過,我只需要在這個嘗試中需要這種行爲。

感謝

編輯

我也試圖遠程@Transactional註釋和createa只是爲了dao.insert,怎麼過TT失敗其他組件內所有實體延遲加載的私人事務性方法(例如printer.print()等)。

回答

2

的解決方案是:

@Transactional(noRollbackFor=Exception.class) 
1

恐怕你可以通過任何API或配置在休眠狀態下實現它。我能想到的唯一方法就是用多種方法破壞你的方法,並且只對需要的內容設置@Transactional。

+0

但如果我沒有在方法中設置@Transactional被交易自動啓動,或者我應該手動啓動它? – Tobia

+0

我試過了,沒有@Transactional我得到「無法初始化代理 - 沒有會話」 – Tobia

1

transactionManager注入到該方法的bean中,並根據需要執行commit/rollback。看看my answer in this question

+0

它可能會解決,但我不明白如何獲得交易......我只是得到這個bean:org.springframework.orm.hibernate4。 HibernateTransactionManager但是如何獲得通過@Transactional註解打開的當前事務? – Tobia