Это будет специфический код JPA-провайдера. Обычно это делается путем вызова unwrap()
в классе EntityManager
.
Если вы используете EclipseLink, будет полезен следующий код (из EclipseLink wiki ) (в случае, если вы используете EntityManager, управляемый приложением):
JPA 2,0
entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class); // unwraps the Connection class.
...
entityManager.getTransaction().commit();
JPA 1,0
entityManager.getTransaction().begin();
UnitOfWork unitOfWork = (UnitOfWork)((JpaEntityManager)entityManager.getDelegate()).getActiveSession();
unitOfWork.beginEarlyTransaction();
Accessor accessor = unitOfWork.getAccessor();
accessor.incrementCallCount(unitOfWork.getParent());
accessor.decrementCallCount();
java.sql.Connection connection = accessor.getConnection();
...
entityManager.getTransaction().commit();
Обратите внимание, что решение, предусмотренное для JPA 2.0, не будет работать для Hibernate 3.6.5 с PersistenceException
, содержащим сообщение
Hibernate не может развернуть интерфейс java.sql.Connection
Используйте код, предоставленный Skaffman, чтобы заставить его работать против Hibernate (проверено на работу под 3.6.5 даже для контекстов персистентности, управляемой контейнером).
Тем не менее, вики EclipseLink указывает на один полезный бит информации - если вы используете управляемые источники данных JTA, вы должны внедрить его с помощью аннотации @Resource
или получить его с помощью поиска JNDI. Пока вам необходимо выполнить транзакционную работу с базой данных, не имеет значения, получаете ли вы новое соединение из источника данных или существующее; в любом случае большинство пулов соединений будет обеспечивать такое же соединение, которое связано с текущим потоком (то есть, тем, которое уже используется менеджером сущностей). Поэтому вы бы избегали развертывания менеджера сущностей таким способом, а также выполняли бы транзакционную деятельность с базой данных; помните, что кеш контекстного хранения и кэш второго уровня могут не синхронизироваться, если вы сделаете это.