我正在使用JPA的openjpa 2.1.0实现.
我有实体的地方有@Version注释注释的属性.
/** version column to control concurrency*/
@Column(name = "XXX_VERSION")
@Version
private Integer xxxVersion;
Run Code Online (Sandbox Code Playgroud)
这里XXX_VERSION是数据类型为数字的表中的列,现在当我通过编辑实体调用merge时,openjpa将从XXX_VERSION列增加值1.
public E update(E entity) {
return entityManager.merge(entity);
}
Run Code Online (Sandbox Code Playgroud)
以上功能如预期,工作绝对正常.
但是当我使用命名查询来更新表中的某些列时,如下所示:
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();
Run Code Online (Sandbox Code Playgroud)
然后版本没有增加,因为如果任何其他并发用户从他的会话中执行任何与DB相同的行,那么版本没有在XXX_VERSION列中增加.
我试图通过递增版本来更新查询,它抛出一个异常,说明无效的查询语法.
在使用命名查询的更新查询的情况下,可以做什么以使版本增加?
我担心这是JPA兼容的.以下是JPA规范(4.10批量更新和删除操作)的摘录:
批量更新直接映射到数据库更新操作,绕过乐观锁定检查.如果需要,便携式应用程序必须手动更新版本列的值,和/或手动验证版本列的值.
因此,您必须手动执行此操作:获取条目并保存,每次一个.
| 归档时间: |
|
| 查看次数: |
1047 次 |
| 最近记录: |