簡體   English   中英

Grails:在組合鍵上映射域類字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM