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

时间:2014-02-13 09:41:32

标签: java jpa

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

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

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

1 个答案:

答案 0 :(得分:6)

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

  

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

所以你必须手动完成:获取条目并保存,每次一个。