审计日志记录跳过表的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场

+0

我应该'通过它return'然后一样吗? – Gideon