1

あるテーブルの主キーが別のテーブルの外部キーでもある場合に、GORMで2つのエンティティをマップするための最良の方法は何ですか。例:

ここに1つの表があります:

CREATE TABLE `table_a` (
`a_id` int(11) NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (`a_id`)
)

そして、このテーブル'a_id'のpkは、次のテーブルによって参照されます。

CREATE TABLE `table_b` (
`b_id` int(11) NOT NULL AUTO_INCREMENT, 
 PRIMARY KEY (`b_id`), 
 KEY `b_id_fk` (`b_id`), 
 CONSTRAINT `b_id_fk` FOREIGN KEY (`b_id`) REFERENCES `table_a' (`a_id`)
 )

上記の2つのエンティティをGrails/GORMにマッピングするにはどうすればよいですか?次のコードは、GORMが「エンティティのマッピングで列を繰り返した」という例外をスローするため、明らかに機能しません。

class TableB {

 TableA tableA
 static belongsTo = [TableA]

 static mapping = {
    id column:"b_id"
    version false
    tableA column:"b_id"
 }

 static constraints = {
    tableA unique: true
 }
}

注:私はgrails 1.3.7を使用していますが、この問題が最近修正された問題である場合は、新しいバージョンに切り替えることができます。私にお知らせください。

4

1 に答える 1

2

それがあなたのケースに当てはまるかどうかはわかりませんが、できることの1つは、サブクラスごとのテーブル継承戦略を使用TableBするサブクラスとしてマップすることです。Grails ガイドのInheritance StrategiesTableAを確認してください。

したがって、次のようになります。

class TableA {
    static mapping = {
        id column: 'a_id'
        table 'table_a'
        version false
        tablePerHierarchy false
    }
}

class TableB extends TableA {
    static mapping = {
        id column: 'b_id'
        table 'table_b'
        version false
    }
}

このアプローチの問題点は、オブジェクトを作成したTableB後にオブジェクトを作成できないことですTableA。Hibernate の仕組みでは、新しいTableAインスタンスを作成すると、レコードtable_aが作成されます。新しいTableBインスタンスを作成するtable_aと、レコード内とレコード内の両方table_bが同じ ID で作成されます。

OTOH、このようなクラス階層のマッピング以外に、そのスキーマの正当な理由は考えられません。

于 2011-06-15T02:16:47.560 に答える