spring Hibernate Envers -不为createQuery(...).executeUpdate()写入审计记录,只为.persist()和.merge()写入审计记录

kknvjkwl  于 2023-09-29  发布在  Spring
关注(0)|答案(4)|浏览(134)

我有三种方法将数据写入数据库

public void create(T object) {
    entityManager.persist(object);
}

public void update(T object) {
    object = entityManager.merge(object);
}

public int updateStatus(String id, String status) {

    final int changes =
                entityManager.createQuery("update item set state = :newState," +
                        " last_modified = current_timestamp" +
                        " where id = : id ")
                    .setParameter("newState", status)
                    .setParameter("id", id)
                    .executeUpdate();

            return changes;
}

我遇到的问题是,为了让Hibernate Envers真正将审计记录写入相应的x_aud和revinfo DB表。它仅对“.persist()”或“.merge()”有效。我无法让它为'codeQuery(...).executeUpdate()'工作
我是错过了什么还是它只是不工作。问题是,我的很多代码都是使用.executeUpdate编写的,而不是合并,所以我真的需要它来处理现有代码。
有人能帮忙吗?

iswrvxsc

iswrvxsc1#

不,如果您使用executeUpdate,Envers将无法工作。这是因为更新不通过Hibernate的事件机制,所以Envers没有机会拦截更改并编写审计。

tsm1rwdh

tsm1rwdh2#

看起来**Avinash T.**是对的,如果你想创建原生SQL查询,使用EntityManagercreateNativeQuery(String sqlString)方法。只有在使用EJBQL时才可以使用createQuery(String ejbqlString)。希望能帮上忙。

cig3rfwq

cig3rfwq3#

试试这个-

public int updateStatus(String id, String status) {

    final int changes =
                entityManager.createQuery("Update Item set state = :newState," +
                        " lastModified = CURRENT_TIMESTAMP" +
                        " where id = : id ")
                    .setParameter("newState", status)
                    .setParameter("id", id)
                    .executeUpdate();

            return changes;
}

以下链接将帮助您了解更多关于JPQL -
http://docs.oracle.com/javaee/6/tutorial/doc/bnbtg.html

4zcjmb1e

4zcjmb1e4#

我还需要更新实体的一个字段。如果你不需要直接使用EntityManager,在我的例子中,Envers知道实体状态变化的解决方案是用@DynamicUpdate注解我的@Entity类,并用@Transactional Package 设置我想要更新的字段的方法。
看看这个答案:Update single field using spring data jpa
检查@DynamicUpdate注解的Hibernate代码:org.hibernate.persister.entity.mutation.UpdateCoordinatorStandard#coordinateUpdate
但请注意,使用@DynamicUpate可能会导致一些性能成本:
指定动态生成带注解实体的SQL更新语句,并且仅包括实际更新的列。如果通常只更改实体的某些属性,则这可能会提高性能。但是,在运行时生成SQL会产生成本

相关问题