2011-10-28 73 views
2

是否可以爲調用DAO(數據訪問對象)方法的方法啓用事務?在BusinessLayerFacade所有方法Spring AOP事務管理和休眠:不需要的數據庫提交

class BusinessLayerFacade implements Facade {

//no transaction handling allowed here 
public X foo() { 
    //do something 
} 

public Y changed(DomainObject myObject) { 
    //do something 
    //<-- start transaction 
    // calling DAO 
    //do something 
    // calling DAO 
    //<-- end transaction 
} 

}

允許交易導致一些不需要提交給數據庫。例如。當調用foo()時執行Exception時執行changed(DomainObject myObject),則myObject已被提交到數據庫,而不是恢復事務回滾上的更改。

任何想法?

這是defenitly通過名稱來過濾方法的選擇,但我們可以請放一點魔術在那裏;-)是否有可能在changed()一個DAO方法的第一個電話開始一個事務,並開始承諾changed()返回。如果這是可能的,那麼在命名類中的新方法時我不必小心。

感謝,斯特凡

+3

沖洗並提交事務是不一樣的。 Hibernate可以決定在事務期間刷新 - 只是爲了同步其會話和數據庫狀態。而休眠可以決定做一個刷新然後回滾事務。 – svaor

+0

我在我的問題中糾正了這個問題。感謝您的建議! – Dangermouse

回答

1

如果運行時異常被拋出事務回滾。如果引發應用程序異常,則不應該。您可以通過應用註釋@Transactional定製這樣的:

@Transactional(rollbackFor=SomeException.class, noRollbackFor=SomeOtherException.class) 

這也可以在全球範圍內XML使用tx:method元素的rollback-forno-rollback-for屬性定製。

閱讀Spring reference documentation瞭解更多詳情。

+0

註釋方法使AOP不相關 – hisdrewness

+0

不,它不。它可以很容易地定製方面應該爲特定方法做些什麼。如果您想要全局定義行爲,請使用XML屬性,如我的答案中所述。 –

+0

註解使事情變得容易定製是一個有爭議的問題。如果他使用註釋,他不會需要AOP,因此無關緊要。即使TX註解驅動使用內部AOP,我也不認爲這是OP的要點或期望的結果。 – hisdrewness

1

所有你需要的是方法層面TX建議:

<tx:advice id="txAdvice" transaction-manager="transactionManager"> 
    <tx:attributes> 
     <tx:method name="changed*" propagation="REQUIRES_NEW" rollback-for="Throwable"/> 
    </tx:attributes> 
</tx:advice> 

<aop:config> 
    <aop:pointcut id="serviceMethods" expression="execution(* my.package.service.*.*(..))"/> 
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/> 
</aop:config> 
+0

這是一個按名稱過濾方法的選項,謝謝!但是我們可以放多一點魔力嗎?-)在**'changed()'中,DAO方法的第一次調用可以啓動一個事務並且開始一個提交**從**返回'()改變'。如果這是可能的,那麼在命名類中的新方法時我不必小心。 – Dangermouse