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:"Row 插入 Class1", className:"com.test.Class1", eventName:"INSERT"]。
AuditEvent[name:"从 Class1 中删除的行", className:"com.test.Class1", eventName:"DELETE"]

我现在想要的是能够打电话AuditLog.get(1).event.name,这就是我卡住的地方。

如何描述eventAuditLog 类中字段的关系以使其根据 AuditLog.className 和 AuditLog.eventName 加载正确的 AuditEvent 对象?

4

2 回答 2

1

由于类名和事件名在 AuditEvent 对象中,因此在 AuditLog 类中不需要它们。但是,您必须在创建 AuditLog 实例时创建/查找 AuditEvent。IE。这两个字段不会自动注入:

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

您最好不要在类中进行关联,而是在 AuditLog 类上使用一个方法来查找 AuditEvent:

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 回答