java - ejemplo - spring auditable entity
Hibernate Envers: no escribe registros de auditorÃa para createQuery(...).executeUpdate(), solo.persist() y.merge() (3)
Tengo 3 maneras en que las cosas se escriben en el 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;
}
El problema que tengo es que los Hibernate Envers realmente escriban los registros de auditoría en la siguiente tabla x_aud y revinfo DB tables. Solo funciona con éxito para ''.persist ()'' o ''.merge ()''. No puedo hacer que funcione para ''createQuery (...) .executeUpdate () ''
¿Me estoy perdiendo algo o simplemente no funciona para esto? El problema es que gran parte de mi código se ha escrito utilizando .executeUpdate y no se fusiona, así que realmente necesito que esto funcione con el código existente.
¿Alguien puede ayudar, por favor?
Parece que Avinash T. tiene razón: si desea crear una consulta SQL nativa, use el createNativeQuery(String sqlString)
de EntityManager
. Usar createQuery(String ejbqlString)
solo es posible si está utilizando EJB QL. Espero que ayude
Prueba esto -
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;
}
El siguiente enlace lo ayudará a aprender más sobre JPQL:
No, Envers no funcionará si está utilizando executeUpdate. Esto se debe a que la actualización no pasa por el mecanismo de eventos de Hibernate, por lo que Envers no tiene posibilidades de interceptar el cambio y escribir la auditoría.