2

2 つのテーブルがあり、そのうちの 1 つ (レガシー テーブル: A) には、複合外部キーとして機能する 2 つのフィールドがあり、もう 1 つ (新しいテーブル: B) は、each row:A has one row:Bリレーションシップに複合主キーを使用する必要があります。これらのテーブルを GORM で説明するにはどうすればよいですか?

これまでのところ、レガシー テーブルを反映するドメイン クラスを作成できました。

class A {

    ...
    //composite foreign key to link B class
    String className;
    String eventName;

    B b; //instance of B to be related

    static mapping = {
        table 'a_table';            
        id column: 'id';
        className column: 'class_name';
        eventName column: 'event_name';
        //b: ???
    }
}

new class:Bこれは機能しますが、と の関係を作成できません。

B を次のように宣言しようとしました。

class B implements Serializable{

    static auditable = true;

    String name;
    String className;
    String eventName;

    static mapping = {
        //supposed to make a composite PK
        id composite:[className, eventName] 
    }
}

しかし、これはコンパイルできません
ERROR context.GrailsContextLoader - Error executing bootstraps: Error evaluating ORM mappings block for domain [com.package.B]: No such property: eventName for class: org.codehaus.groovy.grails.orm.hibernate.cfg.HibernateMappingBuilder

私が欲しいのは次のようなものです:

static mapping = {
    ...
    b composite: [b.className:className, b.eventName:eventName]
    //or whatever is the right way for this to be done.
}

A クラスが GORM にこの関係を処理させるようにします。

4

3 に答える 3

9

属性値を使用する代わりに属性名を使用しようとしましたか?

class B implements Serializable{
    String name;
    String className;
    String eventName;

    static mapping = {
        //supposed to make a composite PK
        id composite:['className', 'eventName'] 
    }
}

そして A のマッピング:

class A {
    static hasMany = [ b : B ]
}

className持ったりeventName入ったりする必要はありませんA

于 2013-02-06T13:32:25.267 に答える
3

B クラスは Serializable と宣言する必要があり、equals メソッドと hashCode メソッドを実装します。

import org.apache.commons.lang.builder.HashCodeBuilder
class B implements Serializable{

    static auditable = true;

    String name;
    String className;
    String eventName;
    boolean equals(other) {
    if (!(other instanceof B)) {
        return false
    }

    other.className == className && other.eventName == eventName
    }

    int hashCode() {
    def builder = new HashCodeBuilder()
    builder.append className
    builder.append eventName
    builder.toHashCode()
    }

    static mapping = {
        //supposed to make a composite PK
        id composite:["className", "eventName"] 
    }
}

AクラスはBクラスの属性を持つ必要があり、GORMは複合外部キーを作成します

class A {

    //composite foreign key to link B class
    B b; //instance of B to be related

    static mapping = {
        table 'a_table';            
        id column: 'id';
    }
}

データベースに2つのテーブルを作成します

+--------------------------------------------------+
|                       A_TABLE                    |  
+--------+-----------+--------------+--------------+
|   id   |  version  |  b_className | b_eventName  |
+--------+-----------+--------------+--------------+
--where the Primary key is "id" and the foreign key are "b_className and b_eventName" 
+--------------------------------------------------+
|                       B                          |  
+--------+-----------+--------------+--------------+
|  name  |  version  |  className   | eventName    |
+--------+-----------+--------------+--------------+
--where the Primary key are "className and eventName" 

列の名前を他の名前に変更する場合は、マッピングステートメントに句を追加するだけです

class A {

    //composite foreign key to link B class
    B b; //instance of B to be related

    static mapping = {
        table 'a_table';            
        id column: 'id';
        columns {
              b {
                 column name: "className"
                 column name: "eventName"
              }
        }
    }
}
于 2015-06-23T16:20:45.453 に答える
0
import org.apache.commons.lang.builder.HashCodeBuilder
class Person implements Serializable {

String firstName
String lastName

boolean equals(other) {
    if (!(other instanceof Person)) {
        return false
    }

    other.firstName == firstName && other.lastName == lastName
}

int hashCode() {
    def builder = new HashCodeBuilder()
    builder.append firstName
    builder.append lastName
    builder.toHashCode()
}

static mapping = {
    id composite: ['firstName', 'lastName']
}
}

これは、grails の公式ドキュメントから見つけることができるものです。

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

やみくもにこれに従うだけで、問題は解決します。説明については、上記のリンクを参照してください

于 2013-11-01T14:21:16.203 に答える