【问题标题】:Grails: map domain class field on composite keyGrails:在复合键上映射域类字段
【发布时间】:2013-03-06 08:52:57
【问题描述】:

我有一个从旧表逆向工程的域类

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[name:"从 Class1 中删除的行", className:"com.test.Class1", eventName:"DELETE"]

我现在想要的是能够打电话给AuditLog.get(1).event.name,这就是我卡住的地方。

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

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

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

    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
    

    【讨论】:

    • 这看起来正是我想要的,谢谢!我会尽快接受它=)
    【解决方案2】:

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

    hasOne 呢?

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

    【讨论】:

    • 不一定是主键。也可以是外键。我尝试使用 hasOne,但它只是添加了一个 event_id 字段,该字段永远不会被填充到旧表中。我希望能够通过classNameeventName 字段选择AuditEvent
    • 哦,我以为 AuditEvent 是一个新表,而 fereign 键将在新表中。
    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多