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
Session newSession = SessionFactoryUtils.openSession(getSessionFactory());
(Session) ReflectionUtils.invokeMethod(openSessionMethod, sessionFactory)
trongopenSession
phương phápMethod openSessionMethod = ClassUtils.getMethod(SessionFactory.class, "openSession")
trênopenSessionMethod
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
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