多租户hibernate实现中的getCurrentSession

时间:2015-01-21 20:39:58

标签: java hibernate session multi-tenant

我现在正在将一个硬代码客户端应用程序重构为多租户应用程序。应用程序非常大,任何变化都很昂贵。我们现在正在开发一个用于选择连接提供程序的组件,并且运行良好,但是在hibernate 3.5之前使用的应用程序和包含HibernateUtil的实现一样,在初学者的许多页面中。问题是在sessionFactory中使用getCurrentSession,因为此方法返回先前打开的当前会话。现在,只使用withOptions方法可以使用openSession()(总是创建一个新会话),而且我们还没有能够计算如何通过打开新会话来获取当前会话。 为了让我明白,hibernate util如下所示:

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被初始化并且新的Transaction被打开,Session永远不会被传回,endTransaction方法,例如,使用getCurrentSession来知道应关闭哪个会话。

我已经从jboss中获取了关于多租户的小文档,并尝试实现CurrentTenantIdentifierResolver,但是我无法理解如何在不更改返回Session对象并将其放入参数的方法的情况下打开会话,因为这会产生数千个更改。

我感谢任何帮助或指导。提前谢谢。

1 个答案:

答案 0 :(得分: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;
}