В зависимости от вашей версии Hibernate, вы можете использовать Envers для обеспечения детального ведения журнала аудита.Это включает в себя возможность добавления «текущего пользователя» из переменной сеанса в данную ревизию:
@Entity
@RevisionEntity(ExampleListener.class)
public class ExampleRevEntity extends DefaultRevisionEntity {
private String username;
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
}
. Это прекрасно интегрируется с Hibernate через серию eventListener, которые вы можете вызвать в Spring следующим образом:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
...
<property name="eventListeners">
<map>
<entry key="post-insert" value-ref="enversEventListener"/>
<entry key="post-update" value-ref="enversEventListener"/>
<entry key="post-delete" value-ref="enversEventListener"/>
<entry key="pre-collection-update" value-ref="enversEventListener"/>
<entry key="pre-collection-remove" value-ref="enversEventListener"/>
<entry key="post-collection-recreate" value-ref="enversEventListener"/>
</map>
</property>
</bean>
Затем вы можете запросить ревизии аудита через API запросов Envers.
После использования этого в нескольких недавних проектах, я предпочитаю технику аудита при использовании Hibernate.
Чтобы ответить на ваш вопрос, вы можете настроить Hibernate Interceptor или Envers RevisionListener для доступа к «текущему пользователю», посмотрев его из текущего контекста Spring:
applicationContext.getBean("currentUser", User.class);
, пока ваш пользовательнастроен как боб области видимости весной.