2

私は 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)。

ドキュメントページの指示に従い、次のことも試しました。

また、プラグインの以前のバージョンを試し、プラグイン関数 (Foo.withHibernateFiltersなど) を使用してフィルターを明示的に有効にしようとしました。

私はまだ立ち往生しているので、Grails Hibernate Filterプラグインを使用してフィルタリングされた結果を得るのを手伝ってくれる人はいますか?

使用ソフトウェアのバージョン:

  • グレイルズ 2.1.3
  • Grails Hibernate 2.1.3
  • Grails Hibernate Filter 0.3.2
  • Java 1.7.0_11
4

1 に答える 1

1

Grails 2.1.3 は Hibernate バージョン 3.6.10 を使用します。Hibernate 3 は、サブクラスのフィルターをサポートしていません (例えば、union サブクラス、join サブクラス)。上記の例で MySuperClass にフィルターを追加すると機能します。Hibernate 4.1.5.SP1 以降のバージョンは、サブクラスのフィルターをサポートします。

MySuperClass.groovy

class MySuperClass {

    ...

    Boolean deleted = false

    static hibernateFilters = {
        deletedFilter(condition:"deleted=0", default:true)
    }

    ...

}

MyDomainClass.groovy

class MyDomainClass extends MySuperClass {

    ...

}

残念ながら、上記はfilter に関する Hibernateのドキュメントに適切に記載されていません。

詳しくは:

于 2013-03-12T06:15:25.297 に答える