7

Grails FAQには次のように書かれています。

Q: src/groovy のソースからドメイン クラスにアクセスするにはどうすればよいですか?

場合によっては、src/groovy に存在し、サービスやその他のアーティファクトから使用する予定のいくつかのユーティリティ クラスを開発していることがあります。ただし、これらのクラスは Grails によって事前にコンパイルされているため、インスタンス化して Book.findByTitle("Groovy in >Action") のように記述することはできません。しかし幸いなことに、これを行うことができるため、回避策があります。

import org.codehaus.groovy.grails.commons.ApplicationHolder

//…</p>

def book = ApplicationHolder.application.getClassForName("library.Book").findByTitle("Groovy in Action")

動的な Gorm メソッドが正しく機能するには、アプリケーションのブートストラップが完了している必要があります。

ただし、ドメイン オブジェクトを直接インポートして、src/groovy クラスで GORM メソッドを問題なく使用できるようです。

Book.findByTitle("Groovy in Action")

ApplicationHolder は非推奨であるため、このアドバイスは古くなっているに違いありませんが、src/groovy から直接ドメイン クラスを使用することを避ける理由はまだありますか?

4

1 に答える 1

6

あなたは正しいです、あなたは時代遅れの情報を参照しています。で定義されたクラス内でドメイン クラスを使用できますsrc/groovy

唯一のオーバーヘッドは、transactions手動で処理する必要があることです。それどころか、デフォルトではservicesインサイドgrails-app/servicesハンド トランザクションです。transactionalフラグが true に設定されている場合、サービスはトランザクションを処理します (デフォルトは何も指定されていない場合の true です)。

一方、ドメイン クラスにアクセスする場合は、ブロックをsrc/groovy使用してトランザクションを手動で処理する必要があります。withTransaction

Book.withTransaction{status->
    def book = Book.findByTitle("Groovy in Action")
    book.title = "Grails in Action"
    book.save()

    status.setRollbackOnly() //Rolls back the transaction
}

詳細についてはwithTransactionを参照してください。

于 2013-06-19T19:53:24.023 に答える