首页 文章

Hibernate - Envers - >属性的审计/版本控制,但仅限于值更改

提问于
浏览
5

我有Hibernate的问题 - Envers . 我有一个只有一个审计属性 status 的域对象,它可以是数字0,1,2,3,4,5之一 .

@Entity
public class Item {
    ...
    @Audited
    private int status;
    ... other variables, setter/getter, ...
}

现在,Envers和Hibernate中的所有东西都在工作 . 创建一个新的Item对象并将其添加到数据库中,一行将插入到 Item_AUD 数据库表中 .

但现在我有更新它的问题 . 我在Hibernate Dao实现中的更新如下所示:

public void updateItem(Item i) {
    SessionFactory sessionFac = HibernateUtility.getSessionFactory();
    Session s = sessionFac.getCurrentSession();
    Transaction trans = s.beginTransaction();
    s.update(i);
    s.flush();
    trans.commit();
}

在每次更新时,都会打印在我的控制台上:

Hibernate: update Item set amount=?, description=?, status=? where id=?
Hibernate: insert into REVINFO (REVTSTMP) values (?)
Hibernate: insert into Item_AUD (REVTYPE, status, id, REV) values (?, ?, ?, ?)

But the problem is, that I only want to insert a row into the REVINFO and Item_AUD if the status number has changed!

例如:我更改项目的 description ,通过调用 updateItem 执行更新,然后Envers将新修订写入审计表 . 但我不想要这种行为 .

我想要的是:只有当 status 的值发生变化时,Envers才会将数据库条目写入审计表 .

但是我怎么能这样做呢?

最诚挚的问候,蒂姆 .

1 回答

  • 5

    为此,您必须扩展AuditEventListener并覆盖其方法 .

    public class EnversListener extends AuditEventListener {
    
          @Override
          public void onPostInsert(PostInsertEvent event) {
    
            Object o = event.getEntity();
    
            if (o instanceof Item) {
    
              Item currentItem = (Item) o;
              Item previousItem = findItemById(currentItem.getId());
    
              if(previousItem != null)
                  if (currentItem.getStatus() != previousItem.getStatus()) 
                     super.onPostInsert(event);
    
            } else {
              super.onPostInsert(event);
            }
          }
    
          @Override
          public void onPostDelete(PostDeleteEvent event) {
            super.onPostDelete(event);
          }
    
          @Override
          public void onPostRecreateCollection(PostCollectionRecreateEvent event) {
            super.onPostRecreateCollection(event);
          }
    
          @Override
          public void onPostUpdate(PostUpdateEvent event) {
              super.onPostUpdate(event);
          }
    
          @Override
          public void onPreRemoveCollection(PreCollectionRemoveEvent event) {
            super.onPreRemoveCollection(event);
          }
    
          @Override
          public void onPreUpdateCollection(PreCollectionUpdateEvent event) {
            super.onPreUpdateCollection(event);
          }
    }
    

    您可以根据需要在其他重写方法中添加自定义约束 . 应该相应地配置hibernate.cfg.xml中侦听器类的路径 .

相关问题