2012-02-14 20 views
11

TodoHibernate 4 Multi-tenencia y Spring 3 Hibernate

I estaba evaluando Multicliente característica presente en Hibernate 4 (4.1.0) junto con Spring 3 (3.1.0), pero no era capaz de conseguir que trabajando con la configuración HibernateTransaction. He definido la configuración de la siguiente manera.

LocalSessionFactoryBean:

@org.springframework.context.annotation.Configuration 
public class Configuration { 

    @Inject private DataSource dataSource; 
    @Inject private MultiTenantConnectionProvider multiTenantConnectionProvider; 

    @Bean 
    public LocalSessionFactoryBean sessionFactory() throws IOException{ 
     LocalSessionFactoryBean bean = new LocalSessionFactoryBean(); 
     bean.setDataSource(dataSource); 
     bean.setPackagesToScan("com"); 
     bean.getHibernateProperties().put("hibernate.multi_tenant_connection_provider", multiTenantConnectionProvider); 
     bean.getHibernateProperties().put("hibernate.multiTenancy", "SCHEMA"); 
     bean.getHibernateProperties().put("hibernate.tenant_identifier_resolver", new CurrentTenantIdentifierResolverImpl()); 
     bean.setConfigLocation(new ClassPathResource("/hibernate.cfg.xml")); 
     return bean; 
    } 

} 

configuration.xml:

<context:component-scan base-package="com.green" /> 


    <context:annotation-config /> 

    <!-- Enable annotation style of managing transactions --> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 

    <!-- Declare a datasource that has pooling capabilities --> 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
     destroy-method="close" p:driverClass="${app.jdbc.driverClassName}" 
     p:jdbcUrl="${app.jdbc.url}" p:user="${app.jdbc.username}" p:password="${app.jdbc.password}" 
     p:acquireIncrement="5" p:idleConnectionTestPeriod="60" p:maxPoolSize="100" 
     p:maxStatements="50" p:minPoolSize="10" /> 

    <!-- Declare a transaction manager --> 
    <bean id="transactionManager" 
     class="com.green.saas.hibernate.SaasHibernateTransactionManager" 
     depends-on="sessionFactory" > 
      <property name="sessionFactory" ref="sessionFactory"></property> 
      <property name="dataSource" ref="dataSource"></property> 
    </bean> 

Si uso normal HibernateTransactionManager proporcionada por el resorte 3 me sale error identificador inquilino no se establece, razón de este ser, abre una sesión como sigue

  1. Session newSession = SessionFactoryUtils.openSession(getSessionFactory());
  2. (Session) ReflectionUtils.invokeMethod(openSessionMethod, sessionFactory) en openSession método
  3. Method openSessionMethod = ClassUtils.getMethod(SessionFactory.class, "openSession") anteriormente openSessionMethod argumento se define como.

podemos ver que no hay un gancho donde se puede proporcionar inquilino-identificador como se espera al abrir una sesión con el inquilino-identificador por ejemplo

Session newSession = getSessionFactory().withOptions().tenantIdentifier ("abc").openSession(); 

o

class instance provided by hibernate property "hibernate.tenant_identifier_resolver" is called by which session is provided with tenant identifier. 

Para superar este Amplié la clase HibernateTransactionManager y sustituyo el método doBegin y cuando se abre una sesión nueva Lo abrí

getSessionFactory().withOptions().tenantIdentifier ("abc").openSession();  

esto hace que la cosa haga clic y trabaje.

Solo quería saber si este enfoque anterior está bien o hay algún ajuste que no conozco que lo hace funcionar de la caja.

Gracias de antemano.

Hibernate - 4.1.0 primavera - 3.1.0

+1

¿es posible mostrar cómo funciona todo en una aplicación maven de muestra? Realmente apreciaré si lo compartes con nosotros. – Maksim

Respuesta