Hibernate Envers - Doesn't write audit records

2019-06-27 12:54发布

I have 3 ways things get written to the DB

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;
}

The problem I have, is in order to get the Hibernate Envers to actually write the audit records to the corrsponsing x_aud and revinfo DB tables. It only works successfully for '.persist()' or '.merge()'. I cannot get it to work for 'createQuery(...).executeUpdate()'

Am I missing something or does it just not work for this. The problem is, a lot of my code has been written using .executeUpdate and not merge, so really I need this to work with the existing code.

Can anyone help please?

3条回答
Ridiculous、
2楼-- · 2019-06-27 13:36

Try this -

    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;
}

Following link wiil help you to learn more about JPQL -

http://docs.oracle.com/javaee/6/tutorial/doc/bnbtg.html

查看更多
做自己的国王
3楼-- · 2019-06-27 13:43

It looks like Avinash T. is right - if you want to create native SQL query, use createNativeQuery(String sqlString) method of EntityManager. Using createQuery(String ejbqlString) is only possible if you're using EJB QL. Hope it would help.

查看更多
虎瘦雄心在
4楼-- · 2019-06-27 13:48

No, Envers won't work if you are using executeUpdate. That is because the update doesn't pass through Hibernate's event mechanism, so Envers has no chances of intercepting the change, and writing the audit.

查看更多
登录 后发表回答