我现在正在将一个硬代码客户端应用程序重构为多租户应用程序。应用程序非常大,任何变化都很昂贵。我们现在正在开发一个用于选择连接提供程序的组件,并且运行良好,但是在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对象并将其放入参数的方法的情况下打开会话,因为这会产生数千个更改。
我感谢任何帮助或指导。提前谢谢。
答案 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;
}