我有三种方法可以写入数据库
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编写而不是合并,所以我真的需要这个来处理现有的代码。
有人可以帮忙吗?
答案 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的更多信息 -
答案 2 :(得分:2)
看起来像 Avinash T。是正确的 - 如果要创建本机SQL查询,请使用createNativeQuery(String sqlString)
的{{1}}方法。只有在使用EJB QL时才能使用EntityManager
。希望它会有所帮助。