2013-02-07 27 views
4

長時間監聽器第一次調用者。如何配置要使用的事務管理器,而不必覆蓋所有的@Transactional方法

我們有一個AbstractService.java類,它包含常用的事務邏輯。並非此類中的所有方法都是事務性的。曾經是,用Spring的@Transactional註解來註釋。

現在AbstractService的每個實現都可能具有不同的事務管理器。這可以在具體類通過重寫在抽象類的方法,並提供不同的Tx管理器被配置成:

@Transactional(值= TRANSACTION_MANAGER)

不可能在通事務管理器名稱添加到抽象類,因爲「註釋屬性Transactional.value的值必須是常量表達式」。

所以有,據我所知,兩種方式來配置事務管理器:

  1. 覆蓋在具體的類每一個@Transactional方法只是調用超級方法:

    @Transactional(timeout = 60, value = TRANSACTION_MANAGER) 
    @Override 
    public String editEntity(Integer id, Integer columnPosition, Object value) { 
    return super.editEntity(id, columnPosition, value); 
    
  2. 改爲在類級別添加@Transactional註釋。這迫使非事務性方法在事務中被處理,並且隨着非事務性方法調用其他事務性方法,我們最終得到一個嵌套的tx湯。

有沒有第三種選擇?就像現在不推薦使用的彈簧測試@NotTransactional將與上述選項2一起使用。

大約三年前有一個very similar question問。既然春天發生了很多事情,那麼我們還有其他選擇嗎?

儘管它是固定的,但自定義註釋答案並未解決問題。

我的問題可以概括:

如何交易進行配置,而不必僅覆蓋所有的交易方法來指定事務管理器?

回答

2

我建議你重構AbstractService分爲三類:

  • 第一類是當前AbstractService,它的接口,方法簽名等,保持二進制與任何現有的子類兼容,但所有實施已被刪除。
  • 第二類包含事務性的所有業務邏輯,因此它使用@Transactional註解(在類級別上具有正確的事務管理器)。
  • 第三類包含所有非事務性業務邏輯。現在

,只需將最後兩個類自動裝配到重構AbstractService,剛剛代表傳入方法調用已移動到新創建的一個類實現。

+0

謝謝你的回覆!第二和第三類是抽象的嗎?開始使用AbstractService的邏輯是爲了使ConcreteClassA和ConcreteClassB可以擴展和訪問公共邏輯。我試圖圍繞你的答案包裹我的頭。在ClassA和ClassB場景中,這些是你的第二堂課嗎?在那種情況下,從那以後,這個結構開始的主要原因將會消失,因爲現在邏輯將需要在這兩個類中生存。我可能在這裏誤解你。 – phantastes

+0

我的想法是將AbstractService重構爲一個抽象的[facade](http://en.wikipedia.org/wiki/Facade_pattern),它委託給兩個具體類,一個事務和一個非事務。因此,當前擴展AbstractService的類都不需要改變 – matsev

+0

我將在重構的基礎上接受這個答案,以將事務方法分解爲它們自己的類。除此之外,它還提出了一個[繼承構成](http://en.wikipedia.org/wiki/Composition_over_inheritance)解決方案,這是一個額外的優點。 – phantastes

相關問題