Hibernate Grails:映射复合键上的域类字段

Hibernate Grails:映射复合键上的域类字段,hibernate,grails,gorm,Hibernate,Grails,Gorm,我有一个从遗留表反向工程的域类 class AuditLog { String className; String eventName; ... AuditEvent event; //need to add this one static mapping = { ... className column: 'class_name'; eventName column: 'event_name';

我有一个从遗留表反向工程的域类

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
包含已执行事件的名称(例如插入/更新/删除)

我需要提供一个人类可读的描述发生了什么。所以我创建了另一个域类

class AuditEvent {

    String name;

    //these should make a composite key
    String className; 
    String eventName;

}
e、 g.AuditEvent[名称:“插入类1的行”,类名称:“com.test.Class1”,事件名称:“插入”]。
AuditEvent[name:“从类1中删除的行”,className:“com.test.Class1”,eventName:“删除”]

我现在想要的是能够调用
AuditLog.get(1).event.name
,这就是我遇到的问题


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

为什么需要AuditEvent的复合主键

哈桑呢

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

class AuditEvent {

    String name

    AuditLog auditLog 

}

为什么AuditEvent需要复合主键

哈桑呢

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

class AuditEvent {

    String name

    AuditLog auditLog 

}

由于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

由于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

它不一定是主键。也可以是外键。我尝试使用hasOne,但它只是添加了一个
event\u id
字段,该字段从未在遗留表中填充。我希望能够通过
className
eventName
字段选择
AuditEvent
。哦,我以为AuditEvent是一个新表,而fereign键将位于新表中。它不一定是主键。也可以是外键。我尝试使用hasOne,但它只是添加了一个
event\u id
字段,该字段从未在遗留表中填充。我希望能够通过
className
eventName
字段选择
AuditEvent
。哦,我以为AuditEvent是一个新表,而fereign键将位于新表中。这看起来正是我要查找的,谢谢!我一成功就会接受它=)这看起来正是我想要的,谢谢!我一成功就会接受它=)