批量更新中的版本属性行为

时间:2013-09-10 06:21:52

标签: jpa jpa-2.0

  
    

应用程序通过在其实体类中定义版本属性来使用乐观锁定。应用程序使用JPQL查询执行实体的批量更新。在这种情况下,下面哪个语句是正确的?

         
      

A.持久性提供程序将确保更新每个表中的版本值。

             

B.更新的权利的版本属性的值也应该由查询显式更新。

    
  

根据JPA规范

  

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

根据我的理解,选项B是正确答案。但我的一些同事正在说另一种方式。你能告诉我正确的行为吗?

1 个答案:

答案 0 :(得分:1)

你是对的,规范A的含义肯定是错误的答案。

当完成JPQL批量更新时,规范的特定实现仍然是大声更新@Version的值。有希望记录某些实现的行为。如果没有,可以使用以下内容检查批量更新是否影响版本:

@Entity
public class SomeEntity {
    @Id private int id;
    private String someValue;
    @Version private int version;
    //getters, setters
}

    //creating entity
    tx.begin();
    SomeEntity se = new SomeEntity();
    se.setId(1);
    em.persist(se);
    tx.commit();

    String versionJpql = "SELECT se.version FROM SomeEntity se WHERE se.id = 1";
    //original version
    Integer version = em.createQuery(versionJpql,Integer.class).getSingleResult();

    //bulk update
    tx.begin();
    em.createQuery(
            "UPDATE SomeEntity se SET se.someValue='some' WHERE se.id = 1"
    ).executeUpdate();
    tx.commit();

    Integer versionAfterUpdate = em.createQuery(versionJpql, Integer.class)
            .getSingleResult();

    //has version been changed:
    assertEquals(version, versionAfterUpdate);