@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();
    }
  }