gpt4 book ai didi

Hibernate - Envers -> 属性的审核/版本控制,但仅当值发生更改时

转载 作者:行者123 更新时间:2023-12-02 09:13:23 25 4
gpt4 key购买 nike

我在使用 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 才应将数据库条目写入审核表中。

但是我该怎么做呢?

最诚挚的问候,蒂姆。

最佳答案

为此,您必须扩展 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 中监听器类的路径应进行相应配置。

关于Hibernate - Envers -> 属性的审核/版本控制,但仅当值发生更改时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4602684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com