복붙노트

[SPRING] Hibernate Envers - createQuery (...) .executeUpdate (), .persist () 및 .merge ()에 대한 감사 레코드를 작성하지 않습니다.

SPRING

Hibernate Envers - createQuery (...) .executeUpdate (), .persist () 및 .merge ()에 대한 감사 레코드를 작성하지 않습니다.

나는 DB에 쓰여지는 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가 실제로 xrs 및 xdb 테이블에 대한 감사 레코드를 쓰게하기 위함이다. '.persist ()'또는 '.merge ()'에 대해서만 성공적으로 작동합니다. 나는 'createQuery (...). executeUpdate ()'에서 작동하도록 할 수 없다.

나는 뭔가를 놓치고 있는가, 아니면 단지 이것을 위해 일하지 않는가? 문제는, 많은 코드가 .executeUpdate를 사용하여 작성되었으며 병합되지 않기 때문에 실제로 기존 코드로 작업해야한다는 것입니다.

아무도 도와 줄 수 있니?

해결법

  1. ==============================

    1.그것은 Avinash T.처럼 보입니다 - 네이티브 SQL 쿼리를 만들려면 EntityManager의 createNativeQuery (String sqlString) 메서드를 사용하십시오. createQuery (String ejbqlString) 사용은 EJB QL을 사용하는 경우에만 가능합니다. 희망이 도움이 될 것입니다.

    그것은 Avinash T.처럼 보입니다 - 네이티브 SQL 쿼리를 만들려면 EntityManager의 createNativeQuery (String sqlString) 메서드를 사용하십시오. createQuery (String ejbqlString) 사용은 EJB QL을 사용하는 경우에만 가능합니다. 희망이 도움이 될 것입니다.

  2. ==============================

    2.아니요, executeUpdate를 사용하는 경우 Envers가 작동하지 않습니다. 이는 Hibernate의 이벤트 메커니즘을 통해 업데이트가 전달되지 않기 때문에 Envers는 변경을 가로 채고 감사를 작성할 기회가 없습니다.

    아니요, executeUpdate를 사용하는 경우 Envers가 작동하지 않습니다. 이는 Hibernate의 이벤트 메커니즘을 통해 업데이트가 전달되지 않기 때문에 Envers는 변경을 가로 채고 감사를 작성할 기회가 없습니다.

  3. ==============================

    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

  4. from https://stackoverflow.com/questions/14139856/hibernate-envers-doesnt-write-audit-records-for-createquery-executeupdat by cc-by-sa and MIT license