2010-07-26 58 views
12
  1. 我們有 被所有管理者繼承的基礎通用管理。基地 經理用 @Transactional註釋註釋。多個事務經理@Transactional註解

  2. 有2組的事務 服務:

    • x.y.service1.* - 必須由transactionManager1
    • x.y.service2.*管理 - 必須由transactionManager2

如何管理交易可以配置沒有nessesity覆蓋所有事務性方法並指定事務管理器?

@Transactional(readOnly = true) 
public abstract class GenericManagerImpl<D extends IGenericDao, T extends BaseObject, PK extends Serializable> 
     implements IGenericManager<T, PK> { 

    protected D dao; 

    @Autowired 
    public void setDao(D dao) { 
     this.dao = dao; 
    } 


    @Transactional(readOnly = false) 
    public void save(T object) { 
     dao.save(object); 
    } 

    @Transactional(readOnly = false) 
    public void remove(T object) { 
     dao.remove(object); 
    } 


} 

@Service 
class UserManagerImpl 
     extends GenericManagerImpl<IUserDao, User, Long> 
     implements IUserManager { 

// Everything is OK. User is managed by txManager1 

} 

@Service 
class BillingManagerImpl 
     extends GenericManagerImpl<IBillingDao, Billing, Long> 
     implements IBillingManager { 

    @Override 
    @Transactional(readOnly = false, value="txManager2") // <--have to override method only to specify txManager 
    public void save(final Billing billing) { 
     super.save(billing); 
    } 

    @Override 
    @Transactional(readOnly = false, value="txManager2") // <--have to override method only to specify txManager 
    public void remove(final Billing billing) { 
     super.remove(billing); 
    } 
} 

最有可能我需要AOP與@Transactional註釋結合起來。
實際上,我想要的是:
1)能夠使用@Transactional註釋配置事務(只讀標誌,傳播,隔離等)。
2)確定戰略選擇我的類(使用AOP之外的事務管理器,例如)
xyservice1 * - >使用txManager1
xyservice2 * - >使用txManager2

是否有可能?

回答

1

我想你可以在類級別

@Service 
@Transactional(readOnly = false, value="txManager2") 
class BillingManagerImpl .... 
+0

我只讀和不只讀基本管理器中的方法。 我有兩個選擇在這裏: 1)具有一流水平的註解@Transactional(唯讀= TRUE)和方法級註解@Transactional(唯讀= FALSE)爲每一個不只讀方式 2)具有一流水平的註解@Transactional( readOnly = false)和方法級別註釋@Transactional(readOnly = true)爲每個只讀方法 在任何情況下,我將需要覆蓋方法級別@transactional註釋的服務必須由txManager2 – Seyran 2010-07-26 10:35:38

10

有可能性create your own annotations作爲快捷方式@Transactional(value="tx1")定義@Transactional

從參考文檔(這些可以在類或方法的量使用):

例如,定義以下注釋

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional("order") 
public @interface OrderTx { 
} 

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional("account") 
public @interface AccountTx { 
} 

允許我們從上一節爲

寫的例子
public class TransactionalService { 

    @OrderTx 
    public void setSomething(String name) { ... } 

    @AccountTx 
    public void doSomething() { ... } 
    } 
+0

+1,好主意。不幸的是, – Bozho 2010-07-26 10:24:36

+0

不是我的。我只查找它:-) – 2010-07-26 10:27:47

+0

是的,我知道我可以使用元註釋。但這只是簡化了配置。 我仍然需要覆蓋方法,並用@OrderTx註釋來註釋它 – Seyran 2010-07-26 10:40:47

相關問題