2011-01-05 30 views
4

我有一個Hibernate的問題 - Envers。我有一個只有一個審計屬性status的域對象,它可以是數字0,1,2,3,4,5之一。休眠 - Envers - >審計/版本的屬性,但只有當值改變

@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才應該將數據庫條目寫入審計表。

但我該怎麼做?

最好的問候,蒂姆。

回答

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中監聽器類的路徑。