2012-02-14 30 views
11

Tất cảHibernate 4 Multi-Tenancy và Spring 3 Hibernate

Tôi đã đánh giá Multi-Tenancy tính năng hiện diện trong Hibernate 4 (4.1.0) cùng với mùa xuân 3 (3.1.0), nhưng đã không thể có được nó làm việc với thiết lập HibernateTransaction. Tôi đã xác định các cài đặt như sau.

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> 

Nếu tôi sử dụng HibernateTransactionManager đơn giản được cung cấp bởi mùa xuân 3 tôi nhận được lỗi nhận dạng thuê nhà không được thiết lập, lý do cho việc này là, nó sẽ mở một phiên như sau

  1. Session newSession = SessionFactoryUtils.openSession(getSessionFactory());
  2. (Session) ReflectionUtils.invokeMethod(openSessionMethod, sessionFactory) trong openSession phương pháp
  3. Method openSessionMethod = ClassUtils.getMethod(SessionFactory.class, "openSession") trên openSessionMethod luận được định nghĩa là.

chúng ta có thể thấy rằng không có móc, nơi bạn có thể cung cấp thuê nhà-identifier như mong đợi trong khi mở một phiên họp với người thuê nhà-identifier ví dụ

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

hoặc

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

Để khắc phục điều này Tôi mở rộng lớp HibernateTransactionManager và phương thức ghi đè doBegin và nơi phiên mới được mở, tôi đã mở nó

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

điều này làm cho nhấp chuột và hoạt động.

Tôi chỉ muốn biết, đây là cách tiếp cận ở trên tốt hay có một số thiết lập mà tôi không biết điều đó làm cho nó hoạt động ra khỏi hộp.

Xin cảm ơn trước.

Hibernate - 4.1.0 mùa xuân - 3.1.0

+1

có thể hiển thị cách mọi thứ hoạt động trong ứng dụng maven mẫu không? Tôi sẽ thực sự đánh giá cao nếu bạn chia sẻ nó với chúng tôi. – Maksim

Trả lời

5

Dường như tính năng này là lỗi trên Hibernate song với phiên bản bạn sử dụng: SPR-9222, HHH-7306.

Bắt đầu từ Hibernate phiên bản 4.1.4 Bạn nên sử dụng CurrentTenantIdentifierResolver để chuyển ID người thuê hiện tại sang SessionFactory.

Các vấn đề liên quan