9

これは 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 で何らかの方法で行うことができますか?

お時間を割いていただき、またご提供いただけるご支援に感謝いたします。

4

2 に答える 2

1

beforeDeleteフックをPersonクラスに追加して、他の親にクエリを実行できます。もう一方の親が存在しない場合は、関係を削除できます。関係には両方の親に対するFKがあるため、おそらく両方の親を削除する必要があるため、外部キー違反が発生していることに注意してください。

于 2009-09-28T18:13:29.893 に答える
0

Personで2つのRelationshipcollectionsを定義することもできます

comingRelationsとoutgoingRelationsは、区別するのに使用できる単語のようです(ドメインに該当する場合)。

ゲッターのみを使用して一時的なプロパティの関係を定義できます。これにより、両方のリレーションシップコレクションの和集合が返されます(変更しないようにするための不変/これらの変更はほとんど意味がありません)

class Person {
   Relationship incomingRelations
   Relationship outgoingRelations
   static mappedBy = [incomingRelations:'p1', outgoingRelations:'p2']

   static transients = ['relations']

   Set getRelations() {
       //creates a new collection as union of the old ones
       return Collections.unmodifiableSet(this.incomingRelations + this.outgoingRelations)
   }
}
class Relationship {
    static belongsTo = [p1:Person, p2:Person]
}

合わない場合は、Miguel-Pingによって提案された均等なアプローチを試してみます

于 2009-10-05T13:15:32.087 に答える