Grails:复合键上的映射域类字段

时间:2013-03-06 08:52:58

标签: hibernate grails gorm

我有一个从遗留表中反向设计的域类

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;

}

e.g。 AuditEvent [name:“Row inserted into Class1”,className:“com.test.Class1”,eventName:“INSERT”]。
AuditEvent [name:“Row1从Class1中删除”,className:“com.test.Class1”,eventName:“DELETE”]

我现在想要的是能够拨打AuditLog.get(1).event.name这就是我被困住的地方。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

为什么需要AuditEvent的复合主键?

hasOne怎么样?

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

class AuditEvent {

    String name

    AuditLog auditLog 

}