Tim*_*Tim 5 hibernate hibernate-envers
我有Hibernate的问题 - Envers.我有一个域对象只有一个审计属性status,可以是数字0,1,2,3,4,5之一.
@Entity
public class Item {
...
@Audited
private int status;
... other variables, setter/getter, ...
}
Run Code Online (Sandbox Code Playgroud)
现在,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();
}
Run Code Online (Sandbox Code Playgroud)
在每次更新时,都会打印在我的控制台上:
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 (?, ?, ?, ?)
Run Code Online (Sandbox Code Playgroud)
但问题是,我只想插入一行REVINFO,Item_AUD如果状态号已经改变了!
例如:我更改description项目,通过调用执行更新,updateItem然后Envers将新修订写入审计表.但我不想要这种行为.
我想要的是:只有status更改了值,Envers才会将数据库条目写入审计表.
但是我怎么能这样做呢?
最诚挚的问候,蒂姆.
为此,您必须扩展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);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以根据需要在其他重写方法中添加自定义约束.应该相应地配置hibernate.cfg.xml中侦听器类的路径.
| 归档时间: |
|
| 查看次数: |
3840 次 |
| 最近记录: |