Java Web Application中的日志记录实体更改

Aru*_*n R 5 aop spring hibernate

我们对项目有要求,我们需要维护对应用程序中某些实体所做的更改的历史记录.Application是一个基于Struts,Spring和Hibernate的Java Web App.在这种情况下使用了哪种方法?

  • 各个表上的触发器是一个想法,但它们不易维护?也许它们也不应该成为交易的一部分(如果触发器失败,则可以,但实体更新事务不应该失败).
  • 使用AoP是因为它是一个贯穿各领域的问题,但必须非常精细,就像在实体更改时仅捕获值一样.(所有编辑都没有相应的不同方法......许多编辑都发生在一个java方法中).
  • 使用Hibernate事件监听器.

是否还有其他方法可以进行此类活动?

Boz*_*zho 5

JBoss Envers支持试听和版本控制-看一下。


Art*_*ald 3

因为你说

所有编辑都没有相应的不同方法...许多编辑发生在单个 java 方法中

即使您的方法只接收一个参数作为参数并且您可以检索其关系,AOP 仍然是一个好主意。我强烈建议你看看这篇好文章

Hibernate 文档本身说:

Hibernate Interceptor 允许应用程序在保存、更新、删除或加载持久对象之前检查和/或操作持久对象的属性。其一种可能的用途是跟踪审计信息。

但它也说

确保您不存储特定于会话的状态,因为多个会话可能同时使用此拦截器

如果使用 Spring 管理的事务,则可以使用sessionFactory.getCurrentSession()获取附加到当前线程的会话;

public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
    if(entity instanceof SomeEntity) {
        Session session = sessionFactory.getCurrentSession();
Run Code Online (Sandbox Code Playgroud)

请参阅getCurrentSession()文档

如果没有,您应该创建一个本地 Hibernate 拦截器(附加到打开的 Session)而不是全局拦截器(附加到 SessionFactory),然后设置其会话

AuditableInterceptor interceptor = new AuditableInterceptor()
Session session = sessionFactory.openSession(interceptor);

/**
  * do it before processing anything if you use local interceptor
  */ 
interceptor.setSession(session);
Run Code Online (Sandbox Code Playgroud)

关于触发器,它取决于其他问题,例如数据库管理(您具有数据库管理访问权限。如果没有,与 DBA 交谈是您最好的选择)。