1

レガシーテーブルからリバースエンジニアリングされたドメインクラスがあります

class AuditLog {

    String className;
    String eventName;
    ...
    AuditEvent event; //need to add this one

    static mapping = {
        ...
        className column: 'class_name';
        eventName column: 'event_name';
        ...
    }
}

className変更されたドメインクラスの名前(com.test.Class1など)とeventName実行されたイベントの名前(INSERT / UPDATE / DELETEなど)が含まれます。

何が起こったのかを人間が読める形式で説明する必要があります。そこで、別のドメインクラスを作成しました

class AuditEvent {

    String name;

    //these should make a composite key
    String className; 
    String eventName;

}

例:AuditEvent [name: "行がClass1"に挿入されました、className: "com.test.Class1"、eventName:"INSERT"]。
AuditEvent [name: "行がClass1"から削除されました、className: "com.test.Class1"、eventName: "DELETE"]

私が今欲しいのは電話をかけることができることAuditLog.get(1).event.nameです、そしてこれは私が立ち往生しているところです。

eventAuditLog.classNameとAuditLog.eventNameに応じて適切なAuditEventオブジェクトをロードするために、AuditLogクラスのフィールドの関係をどのように記述しますか?

4

2 に答える 2

1

クラス名とイベント名はAuditEventオブジェクトにあるため、AuditLogクラスには必要ありません。ただし、AuditLogインスタンスを作成するときは、AuditEventを作成/ルックアップする必要があります。すなわち。2つのフィールドは自動的に挿入されません。

new AuditLog(event: AuditEvent.findOrSaveWhere(className: .., eventName: ..)).save()

クラスで関連付けを行わずに、AuditEventを検索するAuditLogクラスのメソッドを使用する方がよい場合があります。

class AuditEvent {
    // ..
    static AuditEvent get(className, eventName) {
        find 'from AuditEvent e where e.className = :className and e.eventName = :eventName', [className: className, eventName: eventName]
    }
}

class AuditLog {

    String className;
    String eventName;

    // ...

    String getEventName() {
        AuditEvent.get(className, eventName).name
    }
}

これにより、名前の検索は次のようになります。

AuditLog.get(id).eventName
于 2013-03-06T16:35:45.407 に答える
0

AuditEventに複合主キーが必要なのはなぜですか?

hasOneはどうですか?

class AuditLog {
    static hasOne = [event: AuditEvent]
}

class AuditEvent {

    String name

    AuditLog auditLog 

}
于 2013-03-06T09:12:05.580 に答える