我有三种方法将数据写入数据库
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 DB表。它仅对“.persist()”或“.merge()”有效。我无法让它为'codeQuery(...).executeUpdate()'工作
我是错过了什么还是它只是不工作。问题是,我的很多代码都是使用.executeUpdate编写的,而不是合并,所以我真的需要它来处理现有代码。
有人能帮忙吗?
4条答案
按热度按时间iswrvxsc1#
不,如果您使用executeUpdate,Envers将无法工作。这是因为更新不通过Hibernate的事件机制,所以Envers没有机会拦截更改并编写审计。
tsm1rwdh2#
看起来**Avinash T.**是对的,如果你想创建原生SQL查询,使用
EntityManager
的createNativeQuery(String sqlString)
方法。只有在使用EJBQL时才可以使用createQuery(String ejbqlString)
。希望能帮上忙。cig3rfwq3#
试试这个-
以下链接将帮助您了解更多关于JPQL -
http://docs.oracle.com/javaee/6/tutorial/doc/bnbtg.html
4zcjmb1e4#
我还需要更新实体的一个字段。如果你不需要直接使用
EntityManager
,在我的例子中,Envers知道实体状态变化的解决方案是用@DynamicUpdate
注解我的@Entity
类,并用@Transactional
Package 设置我想要更新的字段的方法。看看这个答案:Update single field using spring data jpa
检查
@DynamicUpdate
注解的Hibernate代码:org.hibernate.persister.entity.mutation.UpdateCoordinatorStandard#coordinateUpdate但请注意,使用
@DynamicUpate
可能会导致一些性能成本:指定动态生成带注解实体的SQL更新语句,并且仅包括实际更新的列。如果通常只更改实体的某些属性,则这可能会提高性能。但是,在运行时生成SQL会产生成本