/**
   * Opens new session or returns currently open session for this thread.
   *
   * @return session object.
   * @throws HibernateException if something with session creation goes wrong.
   */
  public static Session openSession() throws HibernateException {
    if (!inited) init();

    Session s = SESSION.get();
    if (s != null) {
      LOG.log(
          Level.WARNING,
          "Openning session more than once from the same thread!",
          new Exception("Dump"));

      s.clear();

      return s;
    } else {
      try {
        lock.lock();
      } catch (InterruptedException e) {
        throw new RuntimeException("Interrupted waiting for session.");
      }

      s = sessionHandler.getSession();
      SESSION.set(s);
    }

    return s;
  }