Представьте себе этот код:
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 или, по крайней мере, диспетчер транзакций, который может его создать), но мой метод не @Transactional. Мне нужно вызвать конструктор, который принимает java.sql.Connection
в качестве параметра. Что я должен делать?