当前位置: 首页 > 面试题库 >

如何在不使用Hibernate拦截器创建审计跟踪表的情况下从数据库获取而不获取previouseState?

郎长卿
2023-03-14
问题内容

我正在尝试创建一个审计表,它将最终看起来像这样:

实体,id,属性,旧值,新值,用户,时间戳

使用hibernate的EmptyInterceptor,
我希望这个表会有很多IO。似乎onFlushDirty方法中的previouseState无法正常工作。

我怎么能不得到如图所示从数据库中获取它的旧值在这里?

public class AuditLogInterceptor extends EmptyInterceptor {
    private Set inserts    = new HashSet();
    private Set updates    = new HashSet();
    private Set deletes    = new HashSet();
    private Map oldies     = new HashMap();

    @Override
    public boolean onSave(Object entity,
                          Serializable id,
                          Object[] state,
                          String[] propertyNames,
                          Type[] types)
            throws CallbackException {
        if (entity instanceof Auditable)
            inserts.add((Auditable)entity);
        return false;
    }

    @Override
    public void onDelete(Object entity, Serializable id, Object[] state,
            String[] propertyNames, Type[] types) {
        if (entity instanceof Auditable)
            deletes.add((Auditable)entity);
    }

    @Override
    public boolean onFlushDirty(Object entity,
                                Serializable id,
                                Object[] currentState,
                                Object[] previousState,
                                String[] propertyNames,
                                Type[] types)
            throws CallbackException {
        if (entity instanceof Auditable) {
            try {
                // Use the id and class to get the pre-update state from the database
                Session tempSession =
                    HibernateUtil.getSessionFactory().openSession();
                Auditable old = (Auditable) tempSession.get(entity.getClass(), ((Auditable) entity).getId());
                oldies.put(old.getId(), old);
                updates.add((Auditable)entity);
            } catch (Throwable e) {
                _log.error(e,e);
            }
        }
        return false;
    }

有没有一种方法可以获取获取更新前的状态而无需往返数据库?


问题答案:

另一种方法是在加载时存储先前的状态。

@Entity
@Table(name='Foo')
class Foo {

    @Transient
    private Foo previousState;

    @PostLoad
    private void setPreviousState(){
        previousState = new Foo();
        //copy the fields
    }

    public Foo getPreviousState(){
        return previousState;
    }

}


 类似资料:
  • 问题内容: 如何在Hibernate拦截器中获取Hibernate会话? 我正在尝试使用Hibernate通过组织ID透明地强制执行数据访问。我设置了一个全局筛选器,以按组织ID筛选所有查询。现在,在保存/更新之前,我需要使用实体拦截器在所有实体上设置组织ID。 组织ID来自HttpSession 我已经在Hibernate会话中将Organizational Id设置为Filter属性,我想在我

  • 我有一个存储库,它返回一个流量,并希望将结果设置为另一个需要列表的对象。有没有其他方法可以在不阻塞的情况下以列表的形式获取结果? 这座大楼正在运转,但需要很长时间。

  • 我在我的应用程序中使用CloudKit作为远程保存数据的一种方式。我的一个记录具有保存图像的CKAsset属性。当我获取记录时,我意识到完成查询要花很多时间。经过多次测试,我得出结论,当您查询记录时,CloutKit会用record对象下载整个资产文件。因此,当您从record对象获取资产并请求它的fileURL时,它会给您一个本地文件路径URL,而不是HTTP类型的URL。这对我来说是一个问题,

  • 问题内容: 但是,首选解决方案(属性访问)在我的情况下不起作用(我缺少列异常-为什么?) 该模型如下所示:实体和。表含有列是的表,以便它是典型的关系。 现在的问题是,如果我取的实体,我需要有机会获得价值(亦称的实体),而不取实体。我怎样才能做到这一点? 我使用的映射如下所示: 我想做的是调用而无需从DB中额外获取实体。 根据我上面提到的答案,如果我将注释从字段移到getter(在实体上,我对吗?)

  • 问题内容: 我想做一个常见问题面板,当用户问它在部门顶部显示的任何问题而无需重新加载页面时,我想我必须每隔几秒钟就与数据库建立连接。现在的问题是,如何在不重新加载页面的情况下建立连接,以及如何显示新问题? 问题答案: 您有两种选择: Ajax,它允许您使用JavaScript从服务器检索数据,然后可以使用它来操作DOM。Ajax的基础是对象,它使您可以在JavaScript中完全检索后台数据。请注

  • 首先,如果这是一个很长的代码段,我很抱歉,但是,我想做一个模态窗口,它将你在我的用户表单中写的东西写下来,并要求你确认它。我目前正在学习Javascript,我不允许使用innerHTML,我必须动态地编写“名字”等(名字的文本),不允许只在弹出窗口内写它。我已经让大多数东西工作,但“名字”“名字”等显示为“未定义”,或者(正如你可以看到的,我在这种情况下只用名字尝试的事情)显示为“空”。 希望有