审计日志记录跳过表的ID复合主键
问题描述:
我执行Audit Logging 1.1 Grails Plugin跟踪更改我的领域类我们项目实施的中途。这些是我们场景的示例域对象:审计日志记录跳过表的ID复合主键
学生需要回答问题。一个问题可以要求一个或多个答案。
class Question {
static auditable = true
Integer id
String content
static hasMany = [
answers: Answer
]
}
class Student {
static auditable = true
Integer id
String name
static hasMany = [
answers: Answer
]
}
class Answer implements Serializable {
static auditable = true
Integer sequence
String value
static belongsTo = [
student: Student,
question: Question
]
static mapping = {
id composite: ["student", "question", "sequence"]
}
}
我每次执行插入/更新任何表,插件触发一个事件,并将其记录到我AuditLog
表。除Answer
表外,所有DML
都按预期成功记录。问题是,PERSISTED_OBJECT_ID
总是空:
+----+---+------------+------------+---------------------+---------------+-----------+-----------+
| ID | … | CLASS_NAME | EVENT_NAME | PERSISTED_OBJECT_ID | PROPERTY_NAME | OLD_VALUE | NEW_VALUE |
+----+---+------------+------------+---------------------+---------------+-----------+-----------+
| … | … | Answer | UPDATE | | value | A | B |
| … | … | Answer | UPDATE | | value | B | A |
+----+---+------------+------------+---------------------+---------------+-----------+-----------+
我想包括logIds = true
配置,但还是没有坚持。没有那个专栏,我无法确定哪个Answer
由谁更新。我期待这将是我所有的复合主键域类的情况。
我能做些什么来解决这个问题?
答
我曾与2.x的插件版本相同的问题时,我的新/属性oldValue为域类对象。我通过覆盖保存为值的域的toString()方法来决定它。尝试为您的“学生”和“问题”域重写toString()。
更新:
我没有用在我的项目组合键ID(现在看来,这就是为什么你的persistedObjectId是空的),也是我用插件的2.x版。我对问题的决定,它看起来像你的,可能是它会帮助你: 我有域:
class Manager {
}
class Customer {
}
class Item {
Manager manager
Customer customer
Item parentItem
BigDecimal qtyOnHand
}
我登录qtyOnHand和parentItem的变化。首先,一切都很简单。对于第二(如记得默认值将是不服这样的: “[ID:15] Object123402”): 1. overrided的toString()
public String toString() {
id
}
在配置2:logIds =假=>插件写入唯一对象的ID
此外,我使用“URI”它(简单这将是)日志经理ID和客户ID:
def getAuditLogUri = {
managerId as String
}
我们可以写所有的URI,比过去beforeInsert:
class Item {
......
def getAuditLogUri = {
getAuditFields()
}
private Map getAuditFields() {
return [managerId: manager.id, customerId: customer.id]
}
....
}
class AuditLog{
String actor
String uri
String className
String persistedObjectId
String propertyName
String oldValue
String newValue
String managerId
String customerId
.....
def beforeInsert() {
getAdditionalFields(uri)
}
private void getAdditionalFields(String fields) {
Map map = Eval.me(fields)
managerId = map.managerId
customerId = map.customerId
}
一切正常,在我的项目,我认为它会工作的persistedObjectId场
我应该'通过它return'然后一样吗? – Gideon