6

Grails 2.1.0 で使用したい (JPA エンティティ、セッション ファクトリ、データ ソース定義を含む)複雑なカスタム構成の Hibernate セットアップを Springに持っています。そのため、既に持っているsessionFactoryandへの参照を Grails に提供したいと考えています。dataSourceしたがって、hibernate.cfg.xml配置されている を使用したくありません (実際には使用できません) 。複雑な構成はすべて、既にテスト済みの作業コードによって既に処理されており、すべて Spring ベースであるため、conf/使用したくありません。DataSource.groovy.

そのため、カスタム Spring 構成をgrails run-app( を介しimportBeans()て) ロードするresources.groovyことができました。 . さて、Grails をそれらを使用し、独自のものを作成しようとしないように構成するにはどうすればよいですか?sessionFactorydataSource

理想的には、dataSource = ref('myDataSource')どこかのようなものが素晴らしいでしょう - そしてそれと同じsessionFactory = ref('sessionFactory')か似ています。これを resources.groovy に入れている人を見たことがありますが、うまくいきません。

私もこれを見ました:

eventDao(com.JavaClassRequiringDataSource) { dataSource = ref('dataSource') }

しかし、どちらも機能しません(機能したかどうかはわかりません)。

どんな助けでも大歓迎です…私はこれを無駄に働かせるために過去10時間を費やしました。Grails の機能がいくつか失われても、それが機能する限り気にしません。当面の目的は、GORM に既にある (~200) エンティティを表示させ、いくつかの足場を作ることです :)

BootStrap.groovy に以下を追加したため、エンティティが Grails に表示されないこともわかっています。

// ...
def grailsApplication
def init = { servletContext -> 
  println grailsApplication.domainClasses
}
// ...

そしてそれは[]を印刷します。

パッチが必要な場合は、どこから始めればよいかについての一般的なアイデアを教えてください。見てみます...これを機能させたいだけです。

ありがとう!

更新 1:

resources.groovy ファイルの呪文をいくつか試しましたが、現在は次のようになっています。

beans = {
    importBeans('main-spring-file-for-the-rest.xml')
    dataSource = ref('dataSource')
}

しかし、足場を作ろうとすると、次のようになります。

Error 2012-09-06 00:02:00,768 [Thread-9] ERROR plugins.DefaultGrailsPlugin  - Cannot generate controller logic for scaffolded class x.y.z.Class. It is not a domain class!

(ログ行の編集: クラスの実際の名前を に置き換えましたx.y.z.Class。) 前に示したように、エンティティのリストは空で、Hibernate を設定する方法がわかりませんsessionFactory。たとえば

sessionFactory = ref('sessionFactory')

うまくいきません。

更新 2:

Bean とエンティティが Spring から読み込まれているが、GORM によって使用または表示されていないため、Grails に組み込まれたユーティリティと新しい Bean を使用して、次のように構成されたエンティティの変換を強制することができましたresources.groovy

public class TestFix implements ApplicationContextAware {
    SessionFactory sessionFactory
    ApplicationContext applicationContext
    GrailsApplication grailsApplication

    def init() {
        GrailsHibernateUtil.configureHibernateDomainClasses(sessionFactory, "sessionFactory", grailsApplication)

    }
}

beans = {
    importBeans('main-spring-file-for-the-rest.xml')

    myBean(TestFix) { bean ->
        sessionFactory = ref('sessionFactory')
        grailsApplication = ref(GrailsApplication.APPLICATION_ID)
        bean.initMethod = 'init'
    }
}

エンティティは Grails によって認識されるようになりましたが、拡張ドメイン オブジェクトには GORM メソッド (.list() など) がないように見えるため、スキャフォールディングは機能しません。すべてのクラスGrailsHibernateUtil.configureHibernateDomainClasses()を作成するときにこれらのメソッドを追加することを期待しますが、GrailsHibernateDomainClassそれは静かに失敗しているか、何かが欠けています(おそらく十分に早く実行されていませんか?わかりません)。

4

1 に答える 1

1

db-reverse-engineer プラグインを使用して、逆の方法を試しましたか? かなり複雑な Spring アプリケーションを grails (約 90 エンティティ) に移行することに大きな成功を収めました。

于 2012-09-07T06:05:58.443 に答える