[英]Grails: map domain class field on composite key
我有一個從舊表反向工程的域類
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 [名稱:“從Class1中刪除行”,className:“ com.test.Class1”,eventName:“ DELETE”]
我現在想要的是能夠調用AuditLog.get(1).event.name
,這就是我AuditLog.get(1).event.name
。
如何描述AuditLog類中event
字段的關系,以使其根據AuditLog.className和AuditLog.eventName加載正確的AuditEvent對象?
由於類名和事件名在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
為什么需要AuditEvent的復合主鍵?
那么hasOne呢?
class AuditLog {
static hasOne = [event: AuditEvent]
}
class AuditEvent {
String name
AuditLog auditLog
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.