0

私は 2 つのドメイン クラスを持っており、互いに単方向の関係が必要です。

class User {
    HistoryEntry lastFooEntry

    static constraints = {
        lastFooEntry(nullable: true)
    }
}
class HistoryEntry {
    String name
    User createdBy
}

Grailsのドキュメントによると(私が理解しているように)、これがその方法です。指定belongsToすると、双方向の関係が作成され(私が望まないもの)、hasOneとにかく双方向の関係でのみ機能します。

上記のモデリングの問題は、次のコードが の場合にのみ機能することentryName=='foo'です。他の値の場合、アサーションは false です。

def addHistoryEntry(Long id, String entryName) {
    def user = User.get(id)
    if(!user) {
        user = new User(id: id).save()
    }
    def entry = new HistoryEntry(createdBy: user, name: entryName).save()
    if(entryName=='foo') {
        user.lastFooEntry = entry
        user.save()
    } else {
        assert user.lastFooEntry!=entry
    }
}

指定することでこれを回避できます

static mappedBy = [createdBy:'']

HistoryEntry。しかし、IntelliJ IDEA とgrails のドキュメントによると、これは と組み合わせてのみ使用する必要があり、空のhasMany文字列と一緒に使用したことはありません。

だから質問:これを行う正しい方法は何ですか?それとも、文書化されていない機能/バグであり、私の回避策は今のところ問題ありませんか?

4

1 に答える 1

1

リレーションシップの反対側にフィールドを指定しない場合、リレーションシップは JVM に関して一方向のままになります。つまり、例は十分であり、それ以上は必要ありません。hasOneinUserまたは/およびbelongsToinHistoryEntryも機能します。

アサーションが false になることはあり得ないため、この例にはおそらく何かが欠けてentryUserます。さらに、entryまだ保存もフラッシュもされていません。

リレーショナル データベースの 1:1 の関係が 1 方向か 2 方向かは、解釈の問題です。通常、外部キーは一方の端にしかありませんが、もう一方の方法も計算できます。

したがって心配はいりません。明示的にフィールドを宣言しない限り、Grails はリレーションシップの反対側に参照フィールドを自動追加しません。

于 2012-10-14T19:29:59.893 に答える