2013-01-03 22 views
4

我有3個方面的東西被寫入到數據庫休眠Envers - 不寫入審覈記錄的createQuery(...)的executeUpdate(),僅.persist()和.merge()

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實際將審計記錄寫入corrsponsing x_aud和revinfo數據庫表中。它僅適用於'.persist()'或'.merge()'。我無法讓它爲'createQuery(...).executeUpdate()'

'

我是錯過了什麼,或者它只是沒有爲此工作。問題是,我的很多代碼都是使用.executeUpdate編寫的,而不是合併,所以我真的需要這個來處理現有的代碼。

任何人都可以幫忙嗎?

+0

它是一個SQL查詢或HQL查詢? –

+0

嗨,是的,它是HQL。 – babb

回答

1

它看起來像Avinash T.是正確的 - 如果你想創建原生SQL查詢,使用createNativeQuery(String sqlString)方法EntityManager。使用createQuery(String ejbqlString)僅當您使用EJB QL時纔可行。希望它會有所幫助。

+0

我沒有使用本地sql查詢,只使用HQL。但是.executeUpdate()上的審計不起作用。有什麼辦法可以達到這個目標嗎? – userab

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

下面的鏈接wiil幫助您瞭解更多關於JPQL -

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

6

不,Envers不會,如果你正在使用的executeUpdate工作。這是因爲更新沒有通過Hibernate的事件機制,所以Envers沒有機會攔截變更並編寫審計。

+0

如果我爲更新編寫Spring數據jpa查詢,是否可以攔截它? – lives