6

sessionFactoryspring 3.2 と hibernate 4 を使用して Bean を作成しようとしています。そのために次のコードを使用しました。しかし、問題はbuildSessionFactory()推奨であり、buildSessionFactory(ServiceRegistry serviceRegistry)代わりに javadoc で使用することをお勧めします。しかし、 ServiceRegistryとは何か、どのように使用するのか理解できませんbuildSessionFactory(ServiceRegistry serviceRegistry)


@Configuration
public class AppConfig {

    ...


    @Bean
    public SessionFactory sessionFactory() {
    return new LocalSessionFactoryBuilder(dataSource())
        .scanPackages("com.mypackages")
        .addProperties(hibernateProperties())
        .buildSessionFactory();

    }
}
4

3 に答える 3

9

ServiceRegistryインターフェイスはサービスの概念に関連しています (これは Hibernate 4 の新機能です)。サービスは、Hibernate にさまざまな機能を提供し、ユーザーが代替実装をプラグインできるクラスです。詳細については、この wiki ページを参照してください。

buildSessionFactory()method を支持して Hibernate のConfigurationクラスでmethodが非推奨になっていることは間違いありませんbuildSessionFactory(ServiceRegistry serviceRegistry)ServiceRegistry純粋な Hibernate の環境 (Spring なし) では、次のようにインスタンスを初期化することが想定されています。

private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;

private static SessionFactory configureSessionFactory() throws HibernateException {
    Configuration configuration = new Configuration();
    configuration.configure();

    serviceRegistry = new ServiceRegistryBuilder()
             .applySettings(configuration.getProperties())
             .buildServiceRegistry();

    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    return sessionFactory;
}

しかし、今では廃止されたメソッドbuildSessionFactory()も の同じ初期化をServiceRegistry行います。

Spring のLocalSessionFactoryBuilderクラスは、Hibernate のクラスの単なる拡張ですConfiguration。しかし、Spring の特定の作業はすべてオーバーライドされたメソッドで行われるため、Spring の環境でLocalSessionFactoryBuilder.buildSessionFactory()メソッドを使用することはできません。まったく同じ動作をするものbuildSessionFactory(ServiceRegistry serviceRegistry)を使用しても問題ないため、大したことはありません。なので、 withでメソッドにアノテーションを付けて、Spring が Hibernate 4 とのより良い統合を提供するのを辛抱強く待ちbuildSessionFactory()ましょう。AppConfig@SuppressWarnings("deprecation")

于 2013-05-05T07:26:46.627 に答える
0

Artem Shafranov が提供する回答は完全に正しいわけではなく、私が行ったように非常に紛らわしい問題に遭遇する可能性があります。

使用する場合

hibernate.hbm2ddl.auto

hbm2dll の接続プールが UserSuppliedConnectionProviderImpl に設定されるため、アプリケーションは起動しません (基本的には null と言えます)。次の例外が表示されます。

org.hibernate.service.UnknownUnwrapTypeException: Cannot unwrap to requested type [javax.sql.DataSource]

この理由は、hbm2dll で使用されている ServiceRegistry に関係していますが、Spring ではうまく機能しません。推奨されるプログラムによるセッション構成方法の多くを使用しても、hbm2dll が実行されたときにまだ適切な参照が得られません。

私のために働いた唯一の方法は次のとおりです

@Inject
DataSource datasource;

@Bean
@SuppressWarnings("deprecation")
public SessionFactory sessionFactory() throws IOException{

    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setPackagesToScan("nl.your.model");
    sessionFactoryBean.setHibernateProperties(hibernateProperties());
    sessionFactoryBean.setDataSource(datasource);
    sessionFactoryBean.afterPropertiesSet();

    return sessionFactoryBean.getObject();
}

LocalSessionFactoryBuilder の使用に失敗しました。驚いたことに、StandardServiceRegistryBuilder の使用も失敗しました。

本当に紛らわしい問題。

于 2015-11-13T18:15:01.200 に答える