我正在尝试使用多租户选项和自动模式创建来配置Hibernate SessionFactory,但是我遇到了这个错误:
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>现在我只使用datasource 1,并且SampleConnectionProvider和TenantResolver总是返回相同的租户和数据源。但是,当Schema Export运行时,它会抛出NullPointerException。为SuppliedConnectionProviderHelper提供的ConnectionProvider为空。在使用多租户时,他似乎无法选择合适的ConnectionProvider。在SchemaExport上创建SuppliedConnectionProviderHelper:
this.connectionHelper = new SuppliedConnectionProviderConnectionHelper(
serviceRegistry.getService( ConnectionProvider.class )
);在使用多租户时,您可以使用hibernate.hbm2ddl.auto吗?已经在hibernate文档中进行了搜索,但没有找到任何内容。
任何帮助都将不胜感激!
诚挚的问候
João Simas
发布于 2013-03-26 23:14:29
看起来在SchemaExport中不支持多租户。我看了其他地方的源码,连接提供者是基于多租户策略获得的。参见第581行here。我在SchemaExport中看不到这一点。另外,如果有多个数据源,SchemaExport也应该自动在其他数据源中创建模式。我没看到SchemaExport做过这样的事。
See和JIRA issue。JIRA问题并不存在您所描述的确切问题,但是建议在注释中创建模式。
这只是我的静态分析。你可能应该打开问题或者在这里等待有人发布答案。据我所知,这似乎是错误或不支持的功能。
发布于 2014-10-01 12:33:09
这是Hibernate中的一个错误...
https://stackoverflow.com/questions/15636595
复制相似问题