2010-07-26 60 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

相关问题