6

マルチテナンシー オプションと自動スキーマ作成を使用して 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)

これが私の春の構成です:

 <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 は常に同じテナントとデータソースを返します。ただし、スキーマ エクスポートを実行すると、NullPointerException がスローされます。SuppliedConnectionProviderHelper に指定された ConnectionProvider が null です。マルチテナンシーを使用する場合、彼は適切な ConnectionProvider を選択できないようです。SuppliedConnectionProviderHelper は SchemaExport で作成されます。

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

マルチテナンシーを使用する場合、hibernate.hbm2ddl.auto を使用できますか? すでに休止状態のドキュメントを検索していますが、何も見つかりませんでした。

どんな助けでも大歓迎です!

よろしくお願いします

ジョアン・シマス

4

2 に答える 2

4

ではマルチテナンシーがサポートされていないようですSchemaExport。マルチテナンシー戦略に基づいて接続プロバイダーを取得する他の場所のソース コードを調べました。こちらの 581 行を参照してください。SchemaExport でそれが発生することはありません。また、複数のデータ ソースがある場合、SchemaExport は他のデータ ソースにもスキーマを自動的に作成する必要があります。SchemaExport がそのようなことをしているとは思えません。

およびJIRA の問題を参照してください。JIRAの問題には、あなたが説明した正確な問題はありませんが、コメントでスキーマを作成するための回避策が提案されています.

これは私の静的分析です。問題を開くか、誰かが回答を投稿するまでここで待つ必要があります。私の知る限り、これはバグまたはサポートされていない機能のようです。

于 2013-03-26T15:14:28.617 に答える
0

これは休止状態のバグです...

https://hibernate.atlassian.net/browse/HHH-7395

于 2014-10-01T04:33:08.693 に答える