2017-03-03 15 views
0

を実装して、プロジェクトの実装の途中でドメインクラスの変更を追跡しています。以下は、このシナリオのドメインオブジェクトの例です。監査ロギングで複合主キーのテーブルのIDがスキップされます

学生は質問に回答する必要があります。質問では、1つまたは複数の回答を求めることができます。
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テーブルにそれを記録します。 DMLは、Answerテーブルを除いて正常に正常に記録されます。

+----+---+------------+------------+---------------------+---------------+-----------+-----------+ 
| 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設定を含めることを試みたが、それはまだ永続ない:問題はPERSISTED_OBJECT_IDは常にnullであるということです。その列がなければ、私はAnswerが誰によって更新されたか特定できません。私はこれが私が持っている複合主キードメインクラスのすべてのケースであることを期待しています。

これを解決するにはどうすればよいですか?

答えて

0

私のnew/oldValueがドメインクラスオブジェクトだったとき、2.xプラグインバージョンで同じ問題が発生しました。私は値として保存されたドメインのtoString()メソッドをオーバーライドすることによってそれを決めました。 "student"と "question"ドメインのtoString()をオーバーライドしてみてください。

更新:

私は私のプロジェクトでIDとして複合キーを使用していませんでしたし、また、私は、プラグインのバージョン2.xを使用(あなたのpersistedObjectIdが空である理由、それはだと思われます)。あなたのように見えるの問題のための私の決定は、それはあなたを助けることがあります

class Manager { 
} 

class Customer { 
} 

class Item { 
Manager manager 
Customer customer 
Item parentItem 
BigDecimal qtyOnHand 
} 

私はqtyOnHandとparentItemの変更をログに記録: 私はドメインを持っています。最初はすべてが簡単です。第二のために(私はデフォルト値がこのようになめらかになります覚えている: "[ID:15] Object123402"): 1.のtoString()構成で

public String toString() { 
    id 
} 

2をオーバーライド:logIds = falseを=>プラグインは書き込みオブジェクト

のIDのみまた、私は(簡単なことが可能になる)そのための「URI」を使用してマネージャーIDと得意先ログ:

def getAuditLogUri = { 
    managerId as String 
} 

我々はbeforeInsert内のすべてのURI内と比べて過去を書き込むことができます。

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 
} 

すべては私のプロジェクトで動作しますが、私はそれが私が `それによってreturn`べきことpersistedObjectIdフィールド

+0

ため同じように機能するだろうと思いますか? – Gideon

関連する問題