Как программно получить PlatformTransactionManager из DAO?
Я занимаюсь разработкой универсального приложения CRUD с калиткой, которое может редактировать любые сущности Spring/JPA с реализацией шаблона AbstractDao, например UserDaoImpl, ForumDaoImpl ... и т. Д.
На моей странице калитки: я должен использовать @SpringBean, чтобы определить, какие PlatformTransactionManager
использовать, например:
@SpringBean(name="transactionManagerUser")
private PlatformTransactionManager transactionManagerUser;
private TransactionTemplate txTemplate;
public CrudPage(final PageParameters pps , final AbstractDao<T> dao)
{
super(pps);
txTemplate= new TransactionTemplate(transactionManagerUser);
}
Проблема в том, что эти DAO используют разные менеджеры транзакций, такие как transactionManagerUser
, transactionManagerForum
...так далее.
Я не могу жестко закодировать эти имена txManager в моем коде. Я должен программно получить дао txManager . Как этого добиться?
Большое спасибо!
------- обновлено -------
Ну, я решил эту проблему, передав PlatformTransactionManager
на страницу CRUD (и использовать transactionTemplate = new TransactionTemplate(platformTransactionManager)
сгенерировать txTemplate ', и он работает хорошо. Хотя и не решает проблему напрямую, все равно работает.
1 ответ
И как вы думаете, почему вы должны использовать логику транзакций в своем коде? Spring использует аспекты для декларативного управления транзакциями, поэтому вам не нужно этого делать. Если вы думаете, что вам нужно, вы делаете это неправильно.
Транзакции не должны входить в компетенцию DAO; службы владеют транзакциями и управляют ими, поскольку в одной транзакции может участвовать несколько DAO.
Интересно, зачем вам несколько менеджеров транзакций. Если у вас есть несколько баз данных, вы должны использовать драйверы XA для каждой и один менеджер транзакций для обработки двухфазной фиксации.