2013-03-26 45 views
6

我想使用多租戶選項和自動模式創建配置Hibernate的SessionFactory,但是卻困此錯誤:休眠4多租戶春3模式導出錯誤

java.lang.NullPointerException 
    at org.hibernate.tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.prepare(SuppliedConnectionProviderConnectionHelper.java:51) 
    at org.hibernate.tool.hbm2ddl.DatabaseExporter.<init>(DatabaseExporter.java:52) 
    at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:367) 
    at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:304) 
    at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:293) 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:498) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1742) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1780) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:242) 

這裏是我的Spring配置:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource1"/> 
    <property name="hibernateProperties"> 
     <props> 
     <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
     <prop key="hibernate.hbm2ddl.auto">create-drop</prop> 
     <prop key="hibernate.show_sql">true</prop> 
     <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop> 

     <prop key="hibernate.multiTenancy">DATABASE</prop> 
     <prop key="hibernate.multi_tenant_connection_provider">org.springframework.webflow.samples.booking.SampleMultiTenantConnectionProvider</prop> 
     <prop key="hibernate.tenant_identifier_resolver">org.springframework.webflow.samples.booking.SampleCurrentTenantIdentifierResolver</prop> 
     </props> 
    </property> 
</bean> 


<!-- Deploys a in-memory "booking" datasource populated --> 
<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> 
    <property name="url" value="jdbc:hsqldb:mem:booking1" /> 
    <property name="username" value="sa" /> 
    <property name="password" value="" /> 
</bean> 

<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> 
    <property name="url" value="jdbc:hsqldb:mem:booking2" /> 
    <property name="username" value="sa" /> 
    <property name="password" value="" /> 
</bean> 

現在我使用的唯一的數據源1,SampleConnectionProvider和TenantResolver總是返回相同的租戶和數據源。但是,當架構導出運行時,它會拋出NullPointerException。提供給ConnectionProvider的SuppliedConnectionProviderHelper爲null。看來在使用多租戶時他不能選擇合適的ConnectionProvider。該SuppliedConnectionProviderHelper上的SchemaExport創建:

this.connectionHelper = new SuppliedConnectionProviderConnectionHelper(
      serviceRegistry.getService(ConnectionProvider.class) 
    ); 

可以使用多租戶當您使用hibernate.hbm2ddl.auto?已經在hibernate文檔中搜索,但沒有找到任何東西。

任何幫助將不勝感激!

問候

若昂Simas

回答

4

它看起來像有在SchemaExport多租戶的支持。我在其他地方查看源代碼連接提供商是基於多租戶策略獲得的。見線581 here。我在SchemaExport中看不到這種情況。另外,如果有多個數據源,則SchemaExport也應該自動在其他數據源中創建模式。我沒有看到SchemaExport做那樣的事情。

SeeJIRA issue。 JIRA問題沒有描述確切的問題,但是有建議在註釋中創建模式的解決方法。

這只是我的靜態分析。您應該打開問題或在此等待某人發佈答案。據我所知,這似乎是錯誤或不支持的功能。

+0

謝謝!我也投了JIRA問題 – 2013-11-27 10:36:32