現在取り組んでいるプロジェクトでは、プロパティをドメイン クラスに動的に追加し、後でデータベースに永続化する必要があります。一般に、「通常の」ドメイン クラスにアタッチされたキー/バリュー ストアが必要です。残念ながら、NoSQL データベース (Redis など) は使用できません。
私のアプローチは、追加のプロパティを別のテーブルsave()
内で識別するafterInsert
かafterUpdate
、別のテーブルに書き込むことで処理することです.ドメインクラス内でマッププロパティを使用するのではなく、追加の「フィールド」テーブルを使用することをお勧めします(検索をより適切にサポートするため)。
metaClass アプローチを使用してプロパティを追加しようとしました:
person.metaClass.middlename = "Biterius"
assert person.middlename == "Biterius" // OK
これは機能し、afterInsert/afterUpdate メソッドで追加のプロパティを特定できますが、その後値を変更できないようです。つまり、次のようには機能しません。
person.middlename = "Tiberius"
assert person.middlename == "Tiberius" // FAIL
次に、Person クラスを Expando クラスで直接 ("Person extends Expando") および抽象中間クラスを介して ("Person extends AbstractPerson" および "AbstractPerson extends Expando") 拡張することにより、 Expando アプローチを試みました。
def person = new Person()
assert person in Person // OK
assert person in AbstractPerson // OK
assert person in Expando // OK
どちらのバリアントも機能しませんでした。任意の「プロパティ」に値を割り当てることはできましたが、値が保存されませんでした。
person.mynewproperty = "Tiberius" // no MissingPropertyException is thrown
println person.mynewproperty // returns null
では、実行時にプログラムでドメイン クラスにプロパティを追加し、変更して afterInsert または afterUpdate 中に取得し、「フィールド」テーブルに「手動で」保存するにはどうすればよいでしょうか。
または、私は何か完全に間違っていますか?これを行う他の/より簡単な方法はありますか?