1

古いGrails1.2アプリケーションを継承しましたが、最新のGrails2.1.2にアップグレードしようとしています。resources.groovyのこのコードが機能していたため、Grailsで何かが変更されました。

searchIndexBuilder(SearchIndexBuilder) {bean ->
    bean.singleton = true
    indexManager = ref("indexManager")
    sessionFactory = ref("sessionFactory")
}

SearchIndexBuilder.javaからのこのコードと組み合わせる:

private void injectHibernateEventListener() {
    try {
        HibernateEventListener hel = initHibernateEventListener();
        SessionFactoryImpl hibernateSessionFactory = (SessionFactoryImpl) sessionFactory; //fails here
        EventListeners hibernateEventListeners = hibernateSessionFactory.getEventListeners();
etc....

SessionFactoryImplを拡張しないSessionFactoryProxyのインスタンスを取得したため、コードはキャストで失敗します。

これを修正するにはどうすればよいですか?

4

1 に答える 1

0

これは Grails 2.0 の新機能で、ドメイン クラスのリロードをサポートするためのものです。2.0 より前では、run-app 中にドメイン クラスを変更すると、アプリケーションが再起動されていましたが、新しいリロード エージェントでは、これは必要ありません。しかし、永続化構成が変更された可能性があるため、Grails はSessionFactory. しかし、Hibernate の設定方法により、他のクラスは古いクラスへの参照を持っているため、参照を持つすべてのクラスを知らずに置き換えることはできません。したがって、プロキシは置換可能な実インスタンスを含めるために使用され、誰もがプロキシでメソッドを呼び出します。が置き換えられると、SessionFactoryそれは完全にプロキシの内部になり、他のユーザーは何かが起こったことを知りません。

これは、SessionFactoryが にならないことを意味しSessionFactoryImplますが、インターフェイスのポイントは具体的な実装クラスを抽象化することなので、実際のクラスが期待するものにキャストするのは悪い習慣です。これは、古いバージョンと現在のバージョンの Grails で動作するはずです。

SessionFactory hibernateSessionFactory = (SessionFactory)sessionFactory;
于 2012-12-13T21:34:29.117 に答える