应用程序通过在其实体类中定义版本属性来使用乐观锁定。应用程序使用 JPQL 查询执行实体的批量更新。在这种情况下,以下哪个语句是正确的?
A.持久化提供者将确保更新每个表中的版本值。
B.更新后的授权的版本属性的值也应该由查询显式更新。
根据 JPA 规范
“批量更新直接映射到数据库更新操作,绕过乐观锁定检查。便携式应用程序必须手动更新版本列的值,如果需要,和/或手动验证版本列的值。”
因此,根据我的理解,选项 B 是正确答案。但是我的一些同事却说反了。你能告诉我正确的行为吗?
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);