У нас есть основной универсальный менеджер, который наследован всеми менеджерами. Основной менеджер аннотируется @Transactional аннотациями.
Существует 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) Смочь настроить транзакции (флаг только для чтения, propogation, изоляция и т.д.) с @Transactional аннотацией.
2) определите стратегию выбрать менеджер транзакций за пределами моих классов (использующий AOP, например)
x.y.service1.*-> используют txManager1
x.y.service2.*-> используют txManager2
Действительно ли это возможно?
Думаю, вы можете определить @Transactional
на уровне классов
@Service
@Transactional(readOnly = false, value="txManager2")
class BillingManagerImpl ....
Существует возможность создавать свои собственные аннотации как ярлыки для @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() { ... }
}