在批量更新命名查询的情况下,JPA中的版本未更新

Sha*_*ede 5 java jpa

我正在使用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列中增加.

我试图通过递增版本来更新查询,它抛出一个异常,说明无效的查询语法.

在使用命名查询的更新查询的情况下,可以做什么以使版本增加?

And*_*i I 6

我担心这是JPA兼容的.以下是JPA规范(4.10批量更新和删除操作)的摘录:

批量更新直接映射到数据库更新操作,绕过乐观锁定检查.如果需要,便携式应用程序必须手动更新版本列的值,和/或手动验证版本列的值.

因此,您必须手动执行此操作:获取条目并保存,每次一个.