Hibernate - Envers -> 属性的审核/版本控制,但仅限于值更改时
-
25-09-2019 - |
题
我对 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 (?, ?, ?, ?)
但问题是,我只想在其中插入一行 REVINFO
和 Item_AUD
如果状态号发生变化!
例如:我改变 description
的项目,通过调用执行更新 updateItem
然后 Envers 向审计表写入新的修订版本。但我不想要这种行为。
我想要的是:仅当值 status
如果发生更改,Envers 应该将数据库条目写入审核表中。
但我该怎么做呢?
最好的问候,蒂姆。
解决方案
为此,您必须扩展 审计事件监听器 & 重写它的方法。
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 中监听器类的路径应进行相应配置。
不隶属于 StackOverflow