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

时间:2013-01-03 13:27:11

标签: java spring hibernate jboss hibernate-envers

我有三种方法可以写入数据库

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数据库表。它只适用于'.persist()'或'.merge()'。我不能让它适用于'createQuery(...) .executeUpdate()'

我是否遗漏了某些内容,或者是否因此无效。问题是,我的很多代码都使用.executeUpdate编写而不是合并,所以我真的需要这个来处理现有的代码。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

试试这个 -

    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

答案 2 :(得分:2)

看起来像 Avinash T。是正确的 - 如果要创建本机SQL查询,请使用createNativeQuery(String sqlString)的{​​{1}}方法。只有在使用EJB QL时才能使用EntityManager。希望它会有所帮助。