@Override public Connection getConnection() throws SQLException { // этот метод может быть вызван кем угодно, в частности методами // 1) SessionFactory.openSession() // 2) SessionFactory.getCurrentSession() // очевидно, что метод (1) может быть вызван из любого контекста, как транзакционного так и нет // поэтому соединение должно быть предоставлено в любом случае. Метод (2) вызывается только // из транзакционного контекста if (CurrentSessionContextHolder.isInCurrentSessionContext()) { try { ManagedConnection managedConnection = (ManagedConnection) connectionFactory.getCurrentConnection(); return managedConnection.getUnderlyingConnection(); } catch (NoCurrentTransactionException e) { // поскольку тут нет транзакционного контекста, то вообще неизвестно какой тип транзакции // надо создать, поэтому создадим обычное подключение, т.е. дефолтное return connectionFactory.openConnection(); } } else { return connectionFactory.openConnection(); } }