これは Grails ユーザー向けです。私は grails - ユーザーのメーリング リストで質問しましたが、数日間これと戦ってきたので、可能な限り広いネットをキャストする必要があると考えました。
2 つのオブジェクトを参照する別のオブジェクト (異なる型) で同じ型の 2 つのオブジェクト間の関係をモデル化しようとすると、いくつかの問題が発生します。
私がやろうとしていることの例として、家族間の関係をモデル化しているとします。与えられた関係は、2 つの異なる家族メンバーに「属する」ものです。そう:
class Person {
hasMany[relationships: Relationship]
static mappedBy = [relationships:'p1', relationships:'p2']
}
class Relationship {
Person p1
Person p2
String natureOfRelationship // for example, "cousins"
static belongsTo = [p1: Person, p2: Person]
}
ここでの意図は、p1 または p2 のいずれかが削除された場合、その削除が hasMany マップ内のすべての Relationship オブジェクトにカスケードされることです。代わりに、試行するたびに、外部キー違反が発生します。ドキュメントで説明されているように、「カスケード」属性を使用してみました:
http://grails.org/doc/1.0.x/guide/single.html#5.5.2.9%20Custom%20Cascade%20Behaviour
そこで、これを Person クラスに追加することにしました。
static mapping = {
relationships cascade:'delete'
}
私もそれで運がありませんでした。
また、Grails が生成する devDB.script ファイルを調べて、Relationship で外部キーがどのように設定されているかを確認しました。「ON DELETE CASCADE」を両方の外部キー制約に手動で追加すると、問題なく動作しますが、自動生成されたデータベース スクリプトを手動で編集することは、最も堅牢なソリューションではありません。理想的には、GORM を使用してその動作を指定できるようにしたいと考えています。
それで、ここで私の最善の策は何ですか?複数の外部キー/所有者に対してカスケード削除を強制する方法はありますか? Person の onDelete アクションを使用して手動でこれを行う必要がありますか? これには Hibernate の設定を行う必要がありますか、それとも Grails/GORM で何らかの方法で行うことができますか?
お時間を割いていただき、またご提供いただけるご支援に感謝いたします。