2013-03-06 65 views
1

我有個域類反向從遺留表工程的Grails:地圖域類字段上覆合鍵

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 [名稱:「插入到Class1中的行」,className:「com.test.Class1」,eventName:「INSERT」]。
AuditEvent [名:「行從1類中刪除」的className:「com.test.Class1」,eventName的:「DELETE」]

我現在想要的是能夠調用AuditLog.get(1).event.name而這正是我米卡住了。

如何描述AuditLog類中event字段的關係,以使其根據AuditLog.className和AuditLog.eventName加載正確的AuditEvent對象?

回答

1

由於classname和eventname在AuditEvent對象中,因此您不需要它們在AuditLog類中。但是,在創建AuditLog實例時,您必須創建/查找AuditEvent。即。這兩個字段不會自動被注入:

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

你可能會更好賺不到的類的關聯,而是對審計日誌類中查找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 
+0

這看起來正是我在找的東西,謝謝!一旦我開始工作,我會盡快接受它=) – svz 2013-03-07 07:15:10

0

爲什麼你需要AuditEvent的組合主鍵?

hasOne呢?

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

class AuditEvent { 

    String name 

    AuditLog auditLog 

} 
+0

這不一定是一個主鍵。也可以是外鍵。我嘗試使用hasOne,但它只是添加了一個'event_id'字段,該字段永遠不會填充到舊錶中。我希望能夠通過'className'和'eventName'字段來選擇'AuditEvent'。 – svz 2013-03-06 09:21:14

+0

哦,我認爲AuditEvent是一個新表,而fereign鍵將放在新表中。 – Dopele 2013-03-06 09:26:50