我正在使用JPA的openjpa 2.1.0实现。
我所在的实体具有使用@Version注释注释的属性。
/** version column to control concurrency*/
@Column(name = "XXX_VERSION")
@Version
private Integer xxxVersion;
这里XXX_VERSION是表中的数据类型为数字的列,现在当我通过编辑实体调用merge时,openjpa将从XXX_VERSION列增加值1。
public E update(E entity) {
return entityManager.merge(entity);
}
以上功能如预期,工作绝对正常。
但是当我使用命名查询来更新表中的某些列时,如下所示:
Query query = getEntityManager().createNamedQuery(update query passed here without version column in it);
query.setParameter(PaymentConstants.QUERY_PARAM_XXX_ID, Long.valueOf(XXXId));
query.executeUpdate();
然后版本没有增加,因为如果任何其他并发用户从他的会话中执行任何与DB相同的行,那么版本没有在XXX_VERSION列中增加。
我试图通过递增版本来更新查询,它会抛出一个异常,说明无效的查询语法。
如果在使用命名查询的更新查询的情况下版本增加了,可以做些什么?
答案 0 :(得分:6)
我担心这是JPA兼容的。以下是JPA规范(4.10批量更新和删除操作)的摘录:
批量更新直接映射到数据库更新操作,绕过 乐观的锁定检查。便携式应用必须手动更新 如果需要,版本列的值和/或手动验证 版本列的值。
所以你必须手动完成:获取条目并保存,每次一个。