gpt4 book ai didi

hibernate - Grails:在复合键上映射域类字段

转载 作者:行者123 更新时间:2023-12-02 14:45:02 24 4
gpt4 key购买 nike

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

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

我现在想要的是能够调用 AuditLog.get(1).event.name这就是我卡住的地方。

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

最佳答案

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

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

关于hibernate - Grails:在复合键上映射域类字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15242747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com