我有一个从遗留表中反向设计的域类
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对象?
答案 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
}