У нас есть приложение JPA (использующее hibernate), и нам нужно передать вызов унаследованному инструменту отчетности, которому в качестве параметра требуется соединение с базой данных JDBC. Есть ли простой способ получить доступ к JDBC-соединению, которое есть в hibernate?
Где вы хотите получить эту связь, неясно. Одна из возможностей - получить его из базовой сессии Hibernate Session
, используемой EntityManager
. В JPA 1.0 вам придется сделать что-то вроде этого:
Session session = (Session)em.getDelegate();
Connection conn = session.connection();
Обратите внимание, что getDelegate()
не переносится, результат этого метода зависит от реализации: приведенный выше код работает в JBoss, для GlassFish вам придется его адаптировать - посмотрите Будьте осторожны при использовании EntityManager.getDelegate().
В JPA 2.0 дела обстоят немного лучше, и вы можете сделать следующее:
Connection conn = em.unwrap(Session.class).connection();
Если вы работаете внутри контейнера, вы также можете выполнить поиск по настроенному DataSource
.
Hibernate внутренне использует ConnectionProvider для получения соединений. Из javadoc спящего режима:
Интерфейс ConnectionProvider не предназначен для предоставления приложению. Вместо этого он используется внутри Hibernate для получения соединений.
Более элегантный способ решить эту проблему - создать пул соединений с базой данных самостоятельно и вручную подключать к спящему режиму и вашему унаследованному инструменту оттуда.