12

別のドメイン クラスを持つ親ドメイン クラスがありhasManyます。親ドメイン クラスと子ドメイン クラスの両方にlastUpdateddateCreatedフィールドと フィールドがあります。私の問題は、子ドメイン クラスを更新するときに、親ドメイン クラスがその変更を反映し、そのlastUpdatedフィールドも更新する必要があることです。

この機能を実装する Grails が提供する親と子の間のマッピングまたはその他の構成はありますか?

アップデート

子ドメイン クラスに次の行を追加しました。

def beforeUpdate = {
    parent.lastUpdated = new Date()
}

lastUpdatedまた、子を更新するときに、新しいフィールドを永続化するために親も保存する必要があることをコントローラーで確認する必要がありました。これはうまくいくようですが、これを行うマッピングまたは同様のものがあるかどうかを知りたいです。

4

3 に答える 3

2

あなたが提案した実装にはバグがあると感じています。日付を手動でparent設定して更新しています。これにより、grailsがダーティチェックを行った後に再度更新される可能性があります。その場合、実際には、最初に設定した日付の後に発生した lastUpdated 時刻になります。あなたのテストでは、これはほんの数 (ミリ) 秒かもしれませんが、それを保証することはできません。lastUpdatedlastUpdated

それだけでなく、親と子の結合を増やしたため、実装を維持するのが難しくなります。

別の実装を提案できますか?lastUpdated フィールドは、特定のドメイン オブジェクトが更新された時刻を表すと想定されています。あなたが探している日付はまったく同じではないので、既存の規則を「間違った」方法で使用しようとはしません。親オブジェクトに必要な日付は「子が最後に変更された日」のようです。

代わりに数式を使用してください。

これを行うには、式を使用できます。数式を使用すると、親オブジェクトを直接変更しなくても、必要なものを正確に取得できます。動的ファインダーやその他の Grails シュガーを使用することもできます。

class Parent {
    ...
    Date lastChildUpdated

    static hasMany = [ children: Child ]

    static mapping = {
        ...
        lastChildUpdated formula: '(SELECT max(c.last_updated) FROM child c WHERE c.parent_id = id)'
    }
}

データベースからオブジェクトを読み取るたびに、GORM は数式の値を読み込みます。これで、子を保存するたびに、親に触れなくても、親はそのプロパティの正確な値を取得できます。

于 2012-07-17T21:37:34.107 に答える
0

ドメインがのような私のプロジェクトの1つ。プログラムには多くのAdvertisingMaterialがあり、AdvertisingMaterial、FlashAd、ImageAdなどのサブクラスがあります。ユーザーはflashAds、imageAdsなどを含むプログラムをフィルタリングする機能を望んでいます。次に、持っているクラスプロパティに基づいてフィルタリングを行う必要があります。データベーステーブル内(テーブルtablePerHierarchyがtrueの場合)。そこで、このプロパティを取得するためにドメインクラスにいくつかの変更を加えました。

class AdvertisingMaterial {
        String className

        static constraints = {
                className(nullable: true)
        }

       static mapping = {
               className formula: 'CLASS'
       }
} 

これで、動的ファインダーと条件クエリでもこのclassNameフィールドを使用できるようになりました。だから私は次のようなことができます

List<AdvertisingMaterial>adMaterials=AdvertisingMaterial.findAllByClassName("com.project.FlashAd")

static mapping = {
               fullName formula: "CONCAT(FIRST_NAME,'  ',LAST_NAME)"
               totalAmount formula: "SUM(AMOUNT)"
}
于 2013-01-29T08:57:31.630 に答える