Представьте себе этот код:
foo() {
Connection conn =...;
}
foo()
был вызван из метода с аннотацией @Transactional
. Как получить текущее соединение JDBC? Обратите внимание, что foo()
находится в bean-компоненте (, поэтому он может иметь @Autowired
поля ), но foo()
не может иметь параметров (, поэтому я не могу передать соединение откуда-то ).
[EDIT] Я использую jOOQ, которому нужен либо источник данных, либо соединение. Моя проблема :Я не знаю, какой менеджер транзакций настроен. Это может быть что угодно; Java EE, основанный на DataSource, что-то, что получает источник данных через JNDI. Мой код не приложение, это библиотека. Мне нужно проглотить то, что другие положили на мою тарелку. Точно так же я не могу запросить фабрику сеансов Hibernate, потому что приложение, использующее меня, может не использовать Hibernate.
Но я знаю, что другой код, например интеграция Spring Hibernate, каким-то образом может получить текущее соединение от диспетчера транзакций. Я имею в виду, что Hibernate не поддерживает диспетчер транзакций Spring, поэтому связующий код должен адаптировать Spring API к тому, что ожидает Hibernate. Мне нужно сделать то же самое, но я не мог понять, как это работает.
[EDIT2] Я знаю, что есть активная транзакция (, т.е. у Spring где-то есть экземпляр Connection или, по крайней мере, диспетчер транзакций, который может создать его ), но мой метод не @ Транзакционный. Мне нужно вызвать конструктор, который принимает java.sql.Connection
в качестве параметра. Что я должен делать?