2010-07-26 2 views
12
  1. У нас есть базовый общий менеджер, который наследуется всеми менеджерами. База менеджер аннотируется с @ Аннотации к транзакции.Несколько менеджеров транзакций с аннотацией @Transactional

  2. Есть 2 группы транзакционных услуг:

    • x.y.service1.* - должны управляться transactionManager1
    • x.y.service2.* - должны управляться transactionManager2

Как могут быть сконфигурированы транзакции без необходимости переопределить все транзакционные методы и указать диспетчер транзакций?

@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); 
    } 
} 

Скорее всего, мне нужно объединить АОП с @Transactional аннотацию.
На самом деле, я хочу:
1) Уметь настраивать транзакции (только флаг, протагонирование, изоляцию и т. Д.) С помощью аннотации @Transactional.
2) определяют стратегию выбора менеджера транзакций за пределами моих классов (с помощью АОП, например)
xyservice1 * -.> Использовать txManager1
xyservice2 * -.> Использовать txManager2

Можно ?

ответ

1

Я думаю, вы можете определить @Transactional на уровне класса

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

Я только что прочитал и не читал только методы в базовом менеджере. У меня есть 2 вариант здесь: 1) имеют аннотацию уровня класса @Transactional (ReadOnly = истина) и аннотация уровня метода @Transactional (доступна только для чтения = ложь) для каждого НЕ читать только методы 2) имеет уровень класса аннотации @Transactional (readOnly = false) и аннотации уровня метода @Transactional (readOnly = true) для каждого метода только для чтения В любом случае мне нужно будет переопределить аннотации @transactional уровня метода для сервисов, которым должно управляться txManager2 – Seyran

10

Существует возможность create your own annotations как ярлыки для @Transactional(value="tx1"). (Они могут быть использованы в классе или на уровне метода)

из справочной документации:

Например, определение следующих аннотаций

@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

+0

не мой, к сожалению. Я только посмотрел :-) –

+0

Да, я знаю, что могу использовать мета-аннотацию. Но это просто упрощает настройку. Мне все еще нужно переопределить метод и аннотировать его аннотацией, как @OrderTx – Seyran

Смежные вопросы