getCurrentSession в многопользовательской hibernate-реализации

Сейчас я выполняю рефакторинг одного клиентского приложения с жестким кодом в мультитенантное приложение. Приложение очень большое и любое изменение стоит дорого. Сейчас мы работаем над разработкой компонента для выбора провайдера подключений, и он работает хорошо, но приложение использовалось до hibernate 3.5 и содержит реализацию для HibernateUtil, как на многих страницах для начинающих. Проблема заключается в использовании getCurrentSession через sessionFactory, поскольку этот метод возвращает текущий сеанс, который был открыт ранее. Теперь, используя только метод withOptions, можно использовать openSession() (всегда создает новый сеанс), и мы не смогли понять, как получить текущий сеанс с открытым новым. Чтобы я понял, утилита hibernate выглядит следующим образом:

public class HibernateUtil implements ObjectFactory {
         private static final SessionFactory sessionFactory;
        static{ // build session factory
        }
        public static void beginTransaction() {
                if(!sessionFactory.getCurrentSession().getTransaction().isActive())
         {
            sessionFactory.getCurrentSession().beginTransaction();
        }
        else
        {
            sessionFactory.getCurrentSession().getTransaction();
         }      
       }
.
.
.

 public static void endTransaction()
    {
        if(sessionFactory!=null && sessionFactory.getCurrentSession()!=null)
        {
            sessionFactory.getCurrentSession().close();
        }
        else
        {
            throw new RuntimeException("Error ");
        }
    }
}

Итак, Session инициализируется и новая транзакция открыта, Session никогда не передается обратно, а метод endTransaction, например, использует getCurrentSession, чтобы узнать, какую сессию следует закрыть.

Я прочитал небольшую документацию от jboss о мультитенантности, и он попытался реализовать CurrentTenantIdentifierResolver, но я не могу понять, как открыть сеанс без изменения методов, возвращающих объект Session и помещающих его в параметры, потому что это генерирует тысячи изменений.

Я ценю любую помощь или руководство. Заранее спасибо.

1 ответ

Вы можете сделать так:

public Session getSession(String tenant)
{

     Session session=null;
     Session session_old=null;
     try{
         session_old=sessionFactory.getCurrentSession();
         log.info(session_old);
     }catch(Exception e){
         log.info("------------no current session----------");
     }finally{
         if(session_old==null || !tenant.equals(session_old.getTenantIdentifier())){
             log.info("**************************Getting new session for tenant="+tenant);
             session=sessionFactory.withOptions().tenantIdentifier(tenant).openSession();
         }else{
             log.info("**************************session from getCurrentSession");
             session=session_old;
         }


     }
     return session;
}
Другие вопросы по тегам