5

私は Grails で遊んでいますが、ドメイン クラスに関して自分が何をしているのかを完全には理解していないため、ORM の作業が退屈だと感じています。誰かが私を軌道に戻してくれることを願っています

次のことを考慮してください

テスト ジョブ ジョブ で使用される 1対多のハードウェア多対 1 の 物理ハードウェア

...これは、大学の DB の例で見られる従来の Order、OrderLine、Product シナリオに類似しています。

次のドメインクラスを作成しました

class Job
{
  String jobName
  String jobDescription
}

class HardwareOnJob
{
   static hasMany = [  jobs:Job, physicalHardware:PhysicalHardware ]
   static belongsTo = Job

   String role
}

class PhysicalHardware
{
  String assetName
  String model
  String os 
}

私が尋ねなければならない質問は、Grails が、私が定義したリンク エンティティ/ドメイン クラスを使用するのではなく、私のデータベースに 2 つの余分なテーブルを作成する理由です。たとえば、Grails はデータベースに hardware_on_job_job と hardware_on_job_physical_hardware を作成します。

スキャフォールディングされたコントローラーを使用して、いくつかのハードウェアを入力し、ジョブを入力してから、2 つを一緒にリンクすることができます。問題は、指定したドメイン オブジェクト (HardwareOnJob) を使用するのではなく、なぜこれら 2 つの追加のテーブルを作成するのかということです。

これを見て新しいことを試してみると、どんな助け/ガイダンスも非常に高く評価されます。ところで、私はgrailsバージョン1.2.1を使用しています

4

5 に答える 5

7

joinTable次のキーワードを見てください。

無方向の 1 対多、多対多、およびプリミティブ コレクション タイプに使用される結合テーブルをカスタマイズします。

ユーザーガイドの例は次のとおりです。

class Book {
    String title
    static belongsTo = Author
    static hasMany = [authors:Author]

    static mapping = {
        authors joinTable:[name:"mm_author_books", key:'mm_book_id' ]
    }
}
class Author {
    String name
    static hasMany = [books:Book]

    static mapping = {
        books joinTable:[name:"mm_author_books", key:'mm_author_id']
    }

}
于 2010-02-12T07:56:53.793 に答える
1

明示的な関連付けクラス/テーブルの使用を検討してください。http://www.grails.org/Many-to-Many+Mapping+without+Hibernate+XMLのメンバーシップクラスを参照してください

副次的な利点は、アソシエーションクラスのスキャフォールディングです(明示的なアソシエーションクラスがないと、これを取得できません)。

于 2010-02-23T05:48:58.660 に答える
0

簡単に言うと、子に親が 1 つだけある場合、親には次のように入力します。

static hasMany = [children: Child]

そしてChildに、あなたは入れます

static belongsTo = [parent: Parent]

(または、カスケードが必要ない場合は、「親の親」を追加するだけで十分だと思いますが、これはまれなケースだと思います)

これにより、双方向の関係が作成されます。つまり、子ドメイン オブジェクトでは、プロパティを介して親オブジェクトにアクセスでき、親オブジェクトでは、children コレクションがあります。

通常、これにより子に列が作成され、その親の ID が保持されます。これは多対多の場合には当てはまりません。何らかのリンク テーブルが必要になる場合です (そして GORM はこれを処理できます)。いわゆる「一方的な」関係 (最初の例のように) もリンク テーブルを作成できます。これについては、次のように説明されています。

http://grails.1312388.n4.nabble.com/Many-to-many-vs-Many-to-one-td1369336.html

于 2011-02-25T13:39:56.200 に答える
0

わかりましたので、遊んだ後、次の構造を思いつきました

class Job 
{ 
  String jobName 
  String jobDescription 

  static mapping = {
     id column:"jobId"
  }

  static hasMany = [hardware:HardwareOnJob]
} 

class HardwareOnJob 
{
   String role 
   Job job
   PhysicalHardware hardware


  static mapping = {
     id column:"hardware_on_job_id"
  }

} 

class PhysicalHardware 
{ 
  String assetName 
  String model 
  String os  

  static mapping = {
     id column:"physical_hardware_id"
  }

  static hasMany = [hardwareOnjob:HardwareOnJob]
} 

これは他のすべての人にとって賢明に見えますか?作成されたデータベース構造は、より親しみやすく、期待どおりの 3 つのテーブルしかありません。

私は人間関係のバックグラウンドを持っているので、人々の考えを聞くことに興味があります。オブジェクトの作成は、レポートを簡単に作成できるようにするという観点から、明確なデータベース設計を提供する手段として考えています。

コメント歓迎

于 2010-02-11T10:36:19.367 に答える
0

1 対多または多対多の関係を使用する場合、grails は関係内のオブジェクトの ID を含む結合テーブルを作成します。1 対多の関係で外部キーを使用するように grails に指示することで、結合テーブルの使用を避けることができます。私の知る限り、自動的に作成された結合テーブルを多対多の関係で使用しないようにする方法はありません。詳細については、セクション 5.2.1.2 および 5.2.1.3 とこれを参照してください

于 2010-02-10T17:39:43.707 に答える