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;
}