私は Groovy と Grails は初めてですが、Hibernate にはかなり慣れています。私が取り組んでいるプロジェクトでは、特定のドメイン クラスのソフト削除を実装する必要があります。Hibernate Filtersは、すべてのクエリに条件を手動で追加しなくても、論理的に削除されたレコードを除外する条件をドメイン クラスに追加できるため、適切なソリューションのようです。幸いなことに、Grails にはHibernate Filter プラグインが用意されており、Grailsで Hibernate Filters を簡単に使用できます。
残念ながら、ご想像のとおり、私はそれを機能させることができません。デバッグすると、すべてが適切に設定されているように見えます (フィルターがエンティティに追加されている、フィルターがセッションで有効になっているなど) が、結果から何もフィルタリングされていません。
私は次のように設定しました:
BuildConfig.groovy
grails.project.dependency.resolution = {
...
plugins {
...
compile ":hibernate-filter:0.3.2"
}
}
app-config.groovy
import org.grails.plugin.hibernate.filter.HibernateFilterDomainConfiguration
dataSource {
...
configClass = HibernateFilterDomainConfiguration
}
MyDomainClass.groovy
class MyDomainClass extends MySuperClass {
...
Boolean deleted = false
static hibernateFilters = {
deletedFilter(condition:"deleted=0", default:true)
}
...
}
MyController.groovy
def list() {
...
myDomainInstances = MyDomainClass.list()
[myDomainInstanceList: myDomainInstances, myDomainInstanceTotal: myDomainInstances.totalCount, ...]
}
上記のコードを使用すると、すべてが適切に構成されているように見えても、常にフィルター処理されていない結果が得られます。アプリケーションの起動をデバッグすると、プラグインが初期化され、ドメイン クラスがスキャンされ、そこから hibernateFilters プロパティが取得されます。この後、Hibernate フィルターが適切に作成されます。リクエストを受信すると、Grails フィルターが起動し、プラグインが現在の Hibernate セッションですべてのデフォルト フィルター (私の場合) を有効にします。結果を除いて、すべてが期待どおりに見えます(Hibernateのロギングでフィルターが有効になっていることがわかります)(SQLロギングはこれで私をバックアップし、WHERE
句は追加されませんdeleted
)。
ドキュメントページの指示に従い、次のことも試しました。
- https://stackoverflow.com/a/6143422/236092
- http://www.intelligrape.com/blog/2010/07/13/grails-hibernate-filter-plugin-a-life-saver/
- https://stackoverflow.com/a/12467408/236092
また、プラグインの以前のバージョンを試し、プラグイン関数 (Foo.withHibernateFilters
など) を使用してフィルターを明示的に有効にしようとしました。
私はまだ立ち往生しているので、Grails Hibernate Filterプラグインを使用してフィルタリングされた結果を得るのを手伝ってくれる人はいますか?
使用ソフトウェアのバージョン:
- グレイルズ 2.1.3
- Grails Hibernate 2.1.3
- Grails Hibernate Filter 0.3.2
- Java 1.7.0_11