1

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

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

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

根据 JPA 规范

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

因此,根据我的理解,选项 B 是正确答案。但是我的一些同事却说反了。你能告诉我正确的行为吗?

4

1 回答 1

1

You are right, what it comes to specification A is definitely wrong answer.

Specific implementations of specification are still aloud to update value of @Version when JPQL bulk update is done. How certain implementation behaves is hopefully documented. When not, following can be used to check does bulk update affect 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);
于 2013-09-10T17:55:39.050 回答