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