它是REST風格的網絡應用程序。我使用Hibernate Envers來存儲歷史數據。除修訂號和時間戳外,我還需要存儲其他詳細信息(例如:IP地址和經過驗證的用戶)。 Envers提供了多種方式來創建一個非常棒的自定義修訂實體。我在修改實體上設置自定義數據時遇到問題。將額外數據傳遞給Hibernate Envers中的自定義修訂實例的方法?
@RevisionEntity(MyCustomRevisionListener.class)
public class MyCustomRevisionEntity extends DefaultRevisionEntity {
private String userName;
private String ip;
//Accessors
}
public class MyCustomRevisionListener implements RevisionListener {
public void newRevision(Object revisionEntity) {
MyCustomRevisionEntity customRevisionEntity = (MyCustomRevisionEntity) revisionEntity;
//Here I need userName and Ip address passed as arguments somehow, so that I can set them on the revision entity.
}
}
由於newRevision()方法不允許任何額外的參數,我不能把我的自定義數據(如用戶名和IP)到它。我怎樣才能做到這一點?
Envers還提供了另一種方法爲:
使用org.hibernate.envers.RevisionListener是,改爲調用getCurrentRevision的另一種方法(類revisionEntityClass,布爾持續)的org.hibernate作爲的方法。 envers.AuditReader接口獲取當前修訂版,並填寫所需的信息。
因此,使用上面的方法,我將不得不做這樣的事情:
改變我現在的道法,如:
public void persist(SomeEntity entity) {
...
entityManager.persist(entity);
...
}
到
public void persist(SomeEntity entity, String userName, String ip) {
...
//Do the intended work
entityManager.persist(entity);
//Do the additional work
AuditReader reader = AuditReaderFactory.get(entityManager)
MyCustomRevisionEntity revision = reader.getCurrentRevision(MyCustomRevisionEntity, false);
revision.setUserName(userName);
revision.setIp(ip);
}
我不對這種方法感覺不太舒服,因爲保持審計數據似乎是我的一個交叉問題。我通過HTTP請求對象獲取userName和Ip等數據。因此,所有數據都需要從應用程序(控制器)的入口點向下流到最低層(dao層)。
有沒有其他方法可以實現這個目標?我正在使用Spring。
我想像的是像Spring一樣保留有關特定方法調用所屬的「堆棧」的信息。因此,當調用newRevision()
時,我知道入口點的哪個特定調用導致此調用。而且,我可以以某種方式獲得傳遞給調用堆棧的第一個方法的參數。
太好了,謝謝!我會嘗試實施它併發布更新。 –
@AnmolGupta你好,你有什麼更新? –
ThreadLocal是處理這種情況的好方法,這就是我通常使用的方式。 –