9

1 対 1 の関係を 2 つの異なる方法で定義しようとしました:
Grails 2.0.3

ケース 1:

class Car {
    String model  
    Engine eng  
    static constraints = {
        eng unique: true
    }
}

class Engine {
    Double capacity
    static belongsTo = [car : Car]
}

ケース 2:

class Car {
    String model
    static hasOne = [eng : Engine]
    static constraints = {
        eng unique: true
    }
}


class Engine {
    Double capacity
    static belongsTo = [car : Car]
}

どちらも似ており、どちらも 1 対 1 の双方向マッピングを提供します。残念ながら、DB はどちらの場合も構造が異なります。

ケース 1: ここに画像の説明を入力

ケース 2: ここに画像の説明を入力

1回の車と1回のエンジンが2番目のテーブルへのリンクを保持するのはなぜですか。

私の問題はどこですか?DDD の観点からコードを見ていると、どちらの場合も、Car クラスがより重要であり、Car が Engine を集約していることを示唆しています。残念ながら、ケース 2 を DB 側から見ると、むしろ逆であると言えます - エンジン集約車。もちろん、最初のアプローチを使用することもできますが、私が見た grails に関する出版物のほとんどは、関係を定義するための 2 番目の方法を提示しています。たぶん私は何かを誤解していて、hasOne を間違った方法で使用していますか?

4

2 に答える 2

19

ドキュメントにhasOneは、これを使用すると、外部キーが子にある双方向の1対1の関係が作成されると記載されています。

belongsTo親で実行されたアクション (保存や更新など) が、休止状態によって子にカスケードされることを意味します。

Engineしたがって、外部キーを on で使用static hasOne = [engine:Engine]したい場合Car

外部キーを on にしたい場合は、 onCarを使用Engine engineしてCarください。

どちらの場合も on を使用belongsTo = [car: Car]しますEngine

于 2012-07-27T04:36:27.637 に答える
-1

私はあなたがこのアプローチを作ろうとすべきだと思います。

   class Car {
       String model
       Engine engine
       static constraints = {
           eng unique: true
       }
   }


   class Engine {
       Double capacity
       Car car
   }

それでうまくいくと思います。あなたはここでそれを読むことができます:

デフォルトでは、アドレスの関連付けはaddress_idと呼ばれる外部キー列にマップされます。

http://grails.org/doc/latest/guide/GORM.html

多対1/1対1マッピングについて


それが役に立てば幸い :)

于 2012-07-20T06:17:42.900 に答える