5

我有 3 种方式将事物写入数据库

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 而不是合并编写的,所以我真的需要它来处理现有代码。

有人可以帮忙吗?

4

3 回答 3

8

不,如果您使用 executeUpdate,Envers 将无法工作。那是因为更新没有经过Hibernate的事件机制,所以Envers没有机会拦截到变化,写审计。

于 2013-01-07T10:42:50.703 回答
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

于 2013-01-04T03:50:49.867 回答
2

看起来Avinash T.是对的——如果你想创建原生 SQL 查询,createNativeQuery(String sqlString)使用EntityManager. createQuery(String ejbqlString)仅当您使用 EJB QL 时才可以使用。希望它会有所帮助。

于 2013-01-03T15:14:42.047 回答