Hibernate - Envers - >审计/版本化属性,但仅在值发生更改时

时间:2011-01-05 09:50:24

标签: hibernate hibernate-envers

我遇到了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 (?, ?, ?, ?)

但问题是,如果状态编号已更改,我只想在REVINFOItem_AUD中插入一行!

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

我想要的是:只有更改status的值时,Envers才会将数据库条目写入审核表。

但我怎么能这样做?

最诚挚的问候,蒂姆。

1 个答案:

答案 0 :(得分: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中侦听器类的路径。